2016-05-09 38 views
9

Czy podstęp eliksiru może prowadzić prywatne metody z poziomu modułu? Np .:Elixir Pry nie może wykonywać prywatnych metod?

defmodule Test do 
    require IEx 

    def foo do 
    IEx.pry 
    end 

    defp bar do 
    end 
end 

W tym momencie połączenie z bar nie działa. Jestem bardzo nowy w eliksiru, czy jest coś, co robię źle, czy powód, dla którego nie jest to możliwe?

Odpowiedz

10

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.