यह अपेक्षित व्यवहार है क्योंकि IEx.pry आपको उन कार्यों के लिए स्थानीय चर तक पहुंच प्रदान करता है, जिन पर इसे कहा जाता है, लेकिन यह आपको मॉड्यूल के दायरे में नहीं डालता है।
IEx.pry
प्रलेखन से:
जब एक प्रक्रिया pried है, सभी कोड आईईएक्स के अंदर चलाता है और, इस तरह के रूप में, यह मूल्यांकन किया जाता है और मॉड्यूल के निजी कार्यों के उपयोग नहीं कर सकते pried जा रहा है। Mod.fun (args) के माध्यम से मॉड्यूल फ़ंक्शंस को अभी भी एक्सेस करने की आवश्यकता है।
आगे बताए जाने के लिए, आप __MODULE__
के मान की जांच कर सकते हैं। यह नहीं के बराबर का मूल्यांकन करता है, तो आप आईईएक्स से चलाने के (क्योंकि आप एक defmodule ब्लॉक के अंदर नहीं कर रहे हैं):
defmodule Test do
require IEx
def foo do
IO.inspect __MODULE__
IEx.pry
end
defp bar do
end
end
:
iex(1)> __MODULE__
nil
आप foo
संशोधित करेगा तो मौजूदा मॉड्यूल का निरीक्षण करने के क्या आपके पास कोई आश्चर्य नहीं मिलेगा
अब हम आईईएक्स में मूल्यांकन करते हैं और उचित परिणाम प्राप्त करते हैं, लेकिन प्रिये में कार्यों का मूल्यांकन आईईएक्स संदर्भ (इसलिए बोलने के लिए) में किया जाता है, इसलिए यदि हम वर्तमान मॉड्यूल की जांच करते हैं तो हम फिर से शून्य हो जाएंगे।
iex(1)> Test.foo
Test
# ... we skip pry ceremony
pry(1)> __MODULE__
nil
अब हम देख सकते हैं कि क्या हो रहा है और क्यों हम IEx.pry
से निजी कार्यों के निष्पादन नहीं कर सकते
मैं समझता हूँ कि यह कैसे आश्चर्य की बात हो सकती है अगर आप एक गहरे लाल रंग का पृष्ठभूमि से आते हैं, आप कर सकते हैं के बाद से जो भी आप चाहते हैं उसे बहुत अधिक एक्सेस करें कि आप सही ऑब्जेक्ट या क्लास के संदर्भ में ब्लॉक का मूल्यांकन करते हैं, लेकिन इलीक्सिर में फ़ंक्शन प्रेषण मूल रूप से भिन्न है।