Elixir Genserver 访问它自己的结构数据

Elixir Genserver access it's own struct data

我有一个使用 defstruct 初始化的 elixir Genserver 模块,但我无法弄清楚如何从它自己的私有模块中的严格访问数据。

这是它初始化的结构:

  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

But how can the module itself access the struct it was initialized with?

函数不能直接访问自身的状态;您需要将 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

有一个 :sys.get_state/{1,2} 函数可以 return GenServer 进程的状态,但是你不能从进程内部调用它,因为它是一个同步的 GenServer 调用,如果进程称它自己。 (该函数还有一个注释,说明它应该只用于调试。)