我有一个长生不老药Genserver模块,它用一个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
但是模块本身如何访问初始化它的结构呢?
函数不能直接访问自身的状态;您需要手动将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}
函数可以返回GenServer进程的状态,但你不能从进程内调用它,因为它是一个同步GenServer调用,如果进程调用它本身,就会产生死锁。(该函数还有一个注释,说明它应该仅用于调试。