Jest to oczekiwane zachowanie, ponieważ IEx.pry zapewnia dostęp do zmiennych lokalnych do funkcji, do których jest wywoływany, ale nie wprowadza cię w zakres obsługiwanego modułu.
Z dokumentacji IEx.pry
:
Gdy proces jest pried, cały kod działa wewnątrz iex i jako taki jest oceniany i nie ma dostępu do prywatnych funkcji modułu jest pried. Funkcje modułu nadal muszą być dostępne przez Mod.fun (args).
Aby dalej zilustrować, można sprawdzić wartość __MODULE__
. Ocenia się do zera, jeśli uruchomić go z IEX (bo nie jesteś wewnątrz bloku defmodule):
iex(1)> __MODULE__
nil
Jeśli chcesz zmodyfikować foo
do wglądu aktualny moduł nie dostanie żadnych niespodzianek:
defmodule Test do
require IEx
def foo do
IO.inspect __MODULE__
IEx.pry
end
defp bar do
end
end
Teraz oceniamy w iex i uzyskujemy odpowiedni wynik, ale pod kątem funkcje są oceniane w kontekście IEx (że tak powiem), więc odzyskalibyśmy ponownie zero, jeśli sprawdzimy bieżący moduł.
iex(1)> Test.foo
Test
# ... we skip pry ceremony
pry(1)> __MODULE__
nil
Teraz możemy zobaczyć, co się dzieje i dlaczego nie możemy wykonywać funkcje prywatne od IEx.pry
rozumiem, jak to może być zaskakujące, jeśli pochodzą z tle ruby, ponieważ można uzyskaj dostęp do niemal wszystkiego, co chcesz, biorąc pod uwagę, że ocenisz blok w kontekście właściwego obiektu lub klasy, ale funkcja wysyłania w eliksiru jest zasadniczo inna.