2016-05-09 10 views
9

エリクシルはモジュール内からプライベートメソッドを実行できますか?例:Elixir Pryはプライベートメソッドを実行できません。

defmodule Test do 
    require IEx 

    def foo do 
    IEx.pry 
    end 

    defp bar do 
    end 
end 

この時点でbarへの呼び出しは機能しません。私はエリキシルには非常に新しいです、私は何か間違っているか、これが不可能な理由がありますか?

答えて

10

IEx.pryは、呼び出された関数のローカル変数にアクセスすることを許可しているが、priedされているモジュールのスコープには入れないため、これは予想される動作です。

IEx.pryドキュメントから:プロセスがこじられた場合

、すべてのコードは、次のような、それが評価され、詮索されているモジュールのプライベートな機能にアクセスすることはできません、IEX内で実行されます。モジュール関数は、引き続きMod.fun(args)を介してアクセスする必要があります。

さらに説明すると、__MODULE__の値を確認できます。あなたはIEXからそれを実行する場合(あなたがdefmoduleブロック内じゃないので)それはnilに評価:

iex(1)> __MODULE__ 
nil 

あなたはどんな驚きを得ることはありませんでしょう、現在のモジュールを検査するfooを変更したい場合:

defmodule Test do 
    require IEx 

    def foo do 
    IO.inspect __MODULE__ 
    IEx.pry 
    end 

    defp bar do 
    end 
end 

私たちはiexで評価し、適切な結果を得ますが、関数はIExコンテキスト(いわば)で評価されるので、現在のモジュールをチェックするとnilが返されます。

iex(1)> Test.foo 
Test 
# ... we skip pry ceremony 
pry(1)> __MODULE__ 
nil 

私はあなたがルビーの背景から来た場合のことができますので、これは、意外なことができる方法を理解する今、私たちは何が起こっているかを見ることができますし、なぜ我々はIEx.pry

からプライベートな機能を実行することはできません適切なオブジェクトやクラスの文脈でブロックを評価することを考えれば、どんなところでもアクセスできますが、エリクシルでの関数のディスパッチは根本的に異なります。

関連する問題