2015-10-28 5 views
6

अमृत में, एक दो अलग अलग तरीकों "राशि" समारोह निर्धारित कर सकते हैं:इलीक्सिर में नामित कार्यों को परिभाषित करने के दो तरीके क्यों हैं?

def sum, do: 0 
def sum(a), do: a 
def sum(a, b), do: a + b 
def sum(a, b, c), do: a + b + c 

या

def sum() do 0 end 
def sum(a) do a end 
def sum(a,b) do a + b end 
def sum(a,b,c) do a + b+ c end 

मैं भी दो दृष्टिकोण मिश्रण कर सकते हैं:

def sum() do 0 end 
def sum(a) do a end 
def sum(a,b) do a + b end 
def sum(a,b,c), do: a + b + c 

मेरे सवालों का हैं: इसे प्राप्त करने के दो तरीके क्यों हैं? क्या इनलाइन कार्यों के मामले में दूसरा पसंदीदा है? उनमें से किसी के फायदे क्या हैं?

अग्रिम धन्यवाद!

उत्तर

11

do...end प्रारूप do: प्रारूप के लिए वाक्य रचनात्मक चीनी है।

यह लागू होता है न केवल काम करता है, यह भी करने के लिए if, case, cond, आदि

case 1, do: (1 -> "a") 

बनाम

case 1 do 
    1 -> "a" 
end 

सामान्य तौर पर, do...end प्रारूप पसंद किया जाता है, जब तक कि समारोह परिभाषाओं कम हैं एक लाइन पर फिट करने के लिए पर्याप्त है।

do इस मामले में वास्तव में एक कीवर्ड सूची में एक पैरामीटर है।

do_clause = Keyword.get(clauses, :do, nil) 
else_clause = Keyword.get(clauses, :else, nil) 

यह do...else...end ब्लॉक के अंदर भाव हो जाता है: कुछ की तरह if मैक्रो के क्रियान्वयन लग रहा है

if foo do 
    #this gets stored in do_clause 
else 
    #this gets stored in else_clause 
end 

नोटif के कार्यान्वयन थोड़ा परिवर्तन किया गया है, आप संस्करण देख सकते हैं मैं https://github.com/elixir-lang/elixir/blob/1a7412502fd581da8ef1378fcd5a057ab96378f7/lib/elixir/lib/kernel.ex#L2294

2

पर इसका जिक्र है यह प्रोग्रामर सुविधा के लिए है। किसी भी निर्दिष्ट तरीके से कार्यों को परिभाषित करने से वास्तविक कार्य में कोई फर्क नहीं पड़ता है।

do..enddo: के लिए वाक्य रचनात्मक चीनी है। जिसका अर्थ है कि यह एक वाक्यविन्यास है जो चीजों को पढ़ने या व्यक्त करने में आसान बनाता है। यह मानव उपयोग के लिए भाषा "मीठा" बनाता है: चीजों को अधिक स्पष्ट रूप से, अधिक संक्षेप में, या एक वैकल्पिक शैली में व्यक्त किया जा सकता है जो कुछ पसंद कर सकते हैं। [wikipiedia]

सामान्य तौर पर, do: वाक्य रचना एक लाइन के लिए पसंद किया जाता है, और do..end कई पंक्तियों

def count(limit), do: count(1,limit) 

defp count(current,limit) when current <= limit do 
    IO.inspect(current) 
    count(current+1,limit) 
end 

#The underscore means we dont care what the arguments are 
defp count(_,_), do: IO.puts("finished") 
के लिए
संबंधित मुद्दे