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