Elixir Genserver получает доступ к своим собственным структурным данным
У меня есть модуль Generver эликсир, который инициализируется с defstruct
Но я не могу понять, как получить доступ к данным из этого строгого в своих собственных частных модулях.
Вот структура, с которой он инициализируется:
defstruct info: "test_data"
...
Вот часть кода. Если другой процесс хочет получить от него информацию, он должен знать, что это pid. и состояние передается автоматически.
def get_info(pid), do: GenServer.call(pid, :get_info)
...
def handle_call(:get_info, _from, state), do: {:reply, state.info, state}
Но как сам модуль может получить доступ к структуре, с которой он был инициализирован?
def do_test(pid), do: GenServer.info(pid, :print_your_own_data_test)
...
def handle_info(:print_your_own_data_test, state) do
print_your_own_data_test()
{:noreply, state}
end
...
defp print_your_own_data_test() do #do I have to pass state here? from handle_info?
IO.put self.info # what goes here?
end
1 ответ
Но как сам модуль может получить доступ к структуре, с которой он был инициализирован?
Функция не может получить доступ к своему состоянию напрямую; вам нужно будет передать состояние, полученное в handle_*
функции к функциям, которым нужно состояние вручную:
def handle_info(:print_your_own_data_test, state) do
print_your_own_data_test(state)
{:noreply, state}
end
defp print_your_own_data_test(state) do
IO.inspect state
end
E сть :sys.get_state/{1,2}
функция, которая может возвращать состояние процесса GenServer, но вы не можете вызвать его изнутри процесса, так как это синхронный вызов GenServer, который создаст тупик, если процесс вызовет его сам. (Эта функция также имеет примечание о том, что она должна использоваться только для отладки.)