エリクシルはモジュール内からプライベートメソッドを実行できますか?例:Elixir Pryはプライベートメソッドを実行できません。
defmodule Test do
require IEx
def foo do
IEx.pry
end
defp bar do
end
end
この時点でbar
への呼び出しは機能しません。私はエリキシルには非常に新しいです、私は何か間違っているか、これが不可能な理由がありますか?
エリクシルはモジュール内からプライベートメソッドを実行できますか?例:Elixir Pryはプライベートメソッドを実行できません。
defmodule Test do
require IEx
def foo do
IEx.pry
end
defp bar do
end
end
この時点でbar
への呼び出しは機能しません。私はエリキシルには非常に新しいです、私は何か間違っているか、これが不可能な理由がありますか?
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
からプライベートな機能を実行することはできません適切なオブジェクトやクラスの文脈でブロックを評価することを考えれば、どんなところでもアクセスできますが、エリクシルでの関数のディスパッチは根本的に異なります。