2015-06-16 3 views
16

जब आप elixir में किसी अज्ञात फ़ंक्शन को परिभाषित करते हैं तो आपको इसका परिणाम मिल जाएगा।elixir में किसी अज्ञात फ़ंक्शन को परिभाषित करने के बाद दिखाई देने वाली संख्या क्या है?

#Function<6.90072148/1 in :erl_eval.expr/5>

मैं क्या देखा है कि नंबर समारोह के arity पर आधारित है। तो एक 1 आर्ग समारोह हमेशा होता है

#Function<6.90072148/1 in :erl_eval.expr/5>

एक दो आर्ग समारोह हमेशा

#Function<12.90072148/2 in :erl_eval.expr/5>

है एक तीन आर्ग समारोह हमेशा

#Function<18.90072148/3 in :erl_eval.expr/5>

है क्या संख्या है वह वापस आ रहा है, और यह कैसे प्राप्त किया जा रहा है?

उत्तर

14

संख्या में इंडेक्स और फ़ंक्शन का एक अद्वितीय नाम शामिल है, जो संकलक द्वारा उत्पन्न होते हैं। implementation of the inspect protocol for functions पर एक नज़र डालें। यह इस मार्ग शामिल हैं:

"#Function<#{uniq(fun_info)}/#{fun_info[:arity]} in " <> 
    "#{Inspect.Atom.inspect(mod)}#{extract_name(fun_info[:name])}>" 

जहां fun_info:erlang.fun_info करने के लिए एक पिछले कॉल का परिणाम को दर्शाता है।

"#Function<#{new_index}.#{uniq}/#{arity} in #{module}.#{name}>" 

आप सही तरीके से महसूस किया होगा, / के बाद वाले हिस्से arity इंगित करता है: यह शिथिल निम्नलिखित छद्म कोड है, जहां सभी अंतर्वेशित मूल्यों fun_info के तत्वों का उल्लेख करने के लिए अनुवाद। module और name आपको दिखाता है कि फ़ंक्शन को परिभाषित किया गया था। new_index मॉड्यूल की फ़ंक्शन तालिका में एक पॉइंटर है, और uniq कंपाइलर द्वारा उत्पन्न मॉड्यूल का हैश मान है। जब आप एक समारोह के लिए :erlang.fun_info आह्वान, आप का निरीक्षण स्ट्रिंग से मूल्यों को पहचान करने में सक्षम हो जाएगा:

iex> fun = fn x -> x end 
#Function<6.90072148/1 in :erl_eval.expr/5> 

iex> fun_info = :erlang.fun_info(fun) 
[pid: #PID<0.58.0>, 
module: :erl_eval, 
new_index: 6, 
new_uniq: <<171, 204, ...>>, 
index: 6, 
uniq: 90072148, 
name: :"-expr/5-fun-4-", 
arity: 1, 
env: [...]] 

uniq मूल्य और सूचकांक एक साथ लिया एक तरह से विशिष्ट रूप से एक गुमनाम समारोह से पहचानते हैं। ध्यान रखें कि iex के अंदर ये अनुमानित अद्वितीय मान आपके द्वारा बनाए गए सभी कार्यों के लिए बहुत समान होंगे, लेकिन जब कोड "ठीक से" संकलित किया जाता है, तो वे अद्वितीय होंगे। निम्नलिखित आईईएक्स सत्र पर विचार करें:

iex> fn -> end 
#Function<20.90072148/0 in :erl_eval.expr/5> 
iex> fn -> end 
#Function<20.90072148/0 in :erl_eval.expr/5> 
iex> fn -> end 
#Function<20.90072148/0 in :erl_eval.expr/5> 

अब elixir fun.exs साथ निम्न फ़ाइल चलाने के लिए है कि तुलना:

IO.inspect fn -> end 
IO.inspect fn -> end 
IO.inspect fn -> end 

# this prints 

#Function<0.120576197 in file:fun.exs> 
#Function<1.120576197 in file:fun.exs> 
#Function<2.120576197 in file:fun.exs> 
+0

यह बहुत अच्छा है। मैंने सोचा कि शायद दशमलव के बाद की संख्या अद्वितीय होनी चाहिए, लेकिन मैंने देखा कि वे मेरे सत्र के लिए ही नहीं थे, लेकिन ज्यादातर सत्रों के लिए मैं इंटरनेट पर आया, जो आश्चर्यजनक था – AndrewSwerlick

+2

हां, यह बहुत भ्रमित था मेरे लिए भी पहले। ऐसा इसलिए होता है क्योंकि मॉड्यूल परिभाषा पर 'uniq' एक हैश फ़ंक्शन है, जो कि ix में' erl_eval' जैसा आप देख सकते हैं। 'इंडेक्स' हमेशा एक ही संख्या होगी क्योंकि हर बार कुछ eval'd है, संदर्भ एक ही है और काउंटर एक ही बिंदु से फिर से शुरू होता है। –

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

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