2016-05-09 12 views
9

क्या मॉड्यूल के भीतर से एलिक्सिर के प्राइव निजी तरीके चल सकते हैं? उदाहरण के लिए:Elixir Pry निजी तरीकों को निष्पादित नहीं कर सकता है?

defmodule Test do 
    require IEx 

    def foo do 
    IEx.pry 
    end 

    defp bar do 
    end 
end 

जो बिंदु पर bar के लिए एक कॉल काम नहीं करता। मैं elixir के लिए बहुत नया हूँ, क्या मैं कुछ गलत कर रहा हूं या एक कारण यह क्यों संभव नहीं है?

उत्तर

10

यह अपेक्षित व्यवहार है क्योंकि 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

से निजी कार्यों के निष्पादन नहीं कर सकते

मैं समझता हूँ कि यह कैसे आश्चर्य की बात हो सकती है अगर आप एक गहरे लाल रंग का पृष्ठभूमि से आते हैं, आप कर सकते हैं के बाद से जो भी आप चाहते हैं उसे बहुत अधिक एक्सेस करें कि आप सही ऑब्जेक्ट या क्लास के संदर्भ में ब्लॉक का मूल्यांकन करते हैं, लेकिन इलीक्सिर में फ़ंक्शन प्रेषण मूल रूप से भिन्न है।

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