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 调用,如果进程称它自己。 (该函数还有一个注释,说明它应该只用于调试。)
我有一个使用 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 调用,如果进程称它自己。 (该函数还有一个注释,说明它应该只用于调试。)