我有一个elixir 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
答案 0 :(得分:2)
但是模块本身如何访问用它初始化的结构?
函数无法直接访问自身的状态;您需要将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调用,如果进程自己调用它会产生死锁。 (该函数还有一个说明,它应该只用于调试。)