2016-05-25 13 views
6

मैंने हाल ही में एलिक्सीर सीखने का फैसला किया है। सी ++/जावा/जावास्क्रिप्ट पृष्ठभूमि से आ रहा है मुझे मूल बातें समझने में बहुत परेशानी हो रही है। यह बेवकूफ लग सकता है लेकिन इलीक्सिर में रिटर्न स्टेटमेंट कैसे काम करेगा? मैं चारों ओर देखा है और ऐसा लगता है जैसे कि यह सिर्फ एक समारोह अर्थातElixir में मूल्य लौट रहे हैं?

def Hello do 
    "Hello World!" 
end 

चाहेंगे इस समारोह वापसी "नमस्ते दुनिया!", वहाँ एक और तरीका है एक वापसी करना है की अंतिम पंक्ति है? इसके अलावा, आप जल्दी कैसे वापस आ जाएंगे? जावास्क्रिप्ट में हम अगर एक सरणी उस में एक निश्चित मूल्य है खोजने के लिए इस तरह कुछ लिख सकते हैं:

function foo(a){ 
    for(var i = 0;i<a.length;i++){ 
     if(a[i] == "22"){ 
     return true; 
     } 
    } 
    return false; 
} 

कैसे अमृत में है कि काम करेंगे?

+1

यहां एक और उदाहरण है कि कैसे जल्दी लौटना है: http: //elixir-examples.github।आईओ/उदाहरण/वापसी-शुरुआती – Brandon

+0

@ ब्रैंडन, धन्यवाद आदमी, तो उस उदाहरण में यदि "some_condition" गलत है तो यह मान को आउटपुट करेगा "do_something()" outputs? –

+0

यह एक बेवकूफ सवाल नहीं है। जब किसी को अनिवार्य भाषाओं में उपयोग किया जाता है तो अंतिम मूल्य की गणना करने वाले प्रत्येक फ़ंक्शन की धारणा के आदी होने के लिए वास्तव में कठिन होता है। इसके साथ चिपकाएं - एक बार जब आप एक मूल्य लौटने वाले प्रत्येक फ़ंक्शन के विचार के लिए उपयोग करते हैं तो आप पाएंगे कि आपके कार्य अधिक समेकित हो जाएंगे। –

उत्तर

5

अमृत नहीं 'बाहर तोड़' कीवर्ड कि अन्य भाषाओं में 'वापसी' कीवर्ड के बराबर होगा है ।

आमतौर पर आप जो करेंगे, वह आपके कोड को दोबारा तैयार करेगा ताकि अंतिम विवरण निष्पादित किया गया वापसी मूल्य है।

नीचे, अमृत में एक मुहावरेदार तरीका है अपने कोड परीक्षण के बराबर प्रदर्शन करना है यह सोचते हैं आप का मतलब है 'एक' कुछ है कि अपने प्रारंभिक उदाहरण की तरह सरणी की तरह बर्ताव करता है के रूप में:

def is_there_a_22(a) do 
    Enum.any?(a, fn(item) -> item == "22" end.) 
end 

क्या वास्तव में हो रहा है यहां हम अपनी सोच को थोड़ा सा पुनर्गठन कर रहे हैं। प्रक्रियात्मक दृष्टिकोण के बजाय, जहां हम सरणी के माध्यम से खोज करेंगे और अगर हम पाते हैं कि हम जो खोज रहे हैं, तो हम जल्दी वापस आ जाएंगे, हम पूछेंगे कि कोड स्निपेट में वास्तव में आप क्या कर रहे हैं: "क्या इस सरणी में 22 है कहीं भी? "

हम फिर हमारे लिए सरणी के माध्यम से चलाने के लिए elixir Enum लाइब्रेरी का उपयोग करने जा रहे हैं, और एक परीक्षण के साथ any? फ़ंक्शन प्रदान करते हैं जो हमें बताएगा कि क्या कुछ भी हमारे द्वारा मानी जाने वाली मानदंडों से मेल खाता है।

हालांकि यह एक ऐसा मामला है जिसे आसानी से गणना के साथ हल किया जाता है, मुझे लगता है कि यह संभव है कि आपके प्रश्न का दिल प्रक्रियात्मक तरीकों में उपयोग किए जाने वाले 'बाउंसर पैटर्न' जैसी चीजों पर अधिक लागू हो। उदाहरण के लिए, यदि मैं किसी विधि में कुछ मानदंडों को पूरा करता हूं, तो तुरंत वापस आएं। इस का एक अच्छा उदाहरण के लिए एक विधि है कि झूठे रिटर्न हो सकता है अगर बात आप पर काम करने के लिए जा रहे हैं रिक्त है:

function is_my_property_true(obj) { 
    if (obj == null) { 
    return false; 
    } 
    // .....lots of code.... 
    return some_result_from_obj; 
} 

एक ही रास्ता वास्तव में अमृत में यह पूरा करने के सामने गार्ड डाल करने के लिए है और एक विधि को अलग:

def test_property_val_from_obj(obj) do 
    # ...a bunch of code about to get the property 
    # want and see if it is true 
end 

def is_my_property_true(obj) do 
    case obj do 
    nil -> false 
    _ -> test_property_value_from_obj(obj) 
    end 
end 

tl; डॉ - कोई वहाँ एक बराबर नहीं है - आप उसके अनुसार अपनी कोड की संरचना करने की जरूरत है। फ्लिप पक्ष पर, यह आपके तरीकों को छोटा रखने के लिए रहता है - और आपका इरादा स्पष्ट है।

+0

यह बहुत समझ में आता है, इसे विस्तार से समझाने के लिए धन्यवाद –

4

आप उस अंतिम अभिव्यक्ति में सही हैं हमेशा वापस आते हैं। और भी - भाषा में कोई बयान नहीं है - बस अभिव्यक्तियां। प्रत्येक निर्माण का मूल्य होता है - if, case, आदि। कोई प्रारंभिक वापसी भी नहीं है। यह सीमित लग सकता है, लेकिन आप इसे जल्दी से उपयोग करते हैं।

अमृत के साथ अपने उदाहरण का समाधान करने के लिए एक उच्च आदेश समारोह का उपयोग करने के होगा एक सामान्य तरीके:

def foo(list) do 
    Enum.any?(list, fn x -> x == "22" end) 
end 
+0

स्पष्टीकरण के लिए धन्यवाद मुझे एलीक्सिर की बयानहीनता के आसपास अपना सिर लपेटना है। –

संबंधित मुद्दे