【问题标题】:Elixir Genserver access it's own struct dataElixir Genserver 访问它自己的结构数据
【发布时间】:2017-10-26 13:20:49
【问题描述】:

我有一个 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

【问题讨论】:

  • 是的,您需要手动传递状态。你试了有没有遇到什么错误?
  • 不,在我提出这个问题之前,我正在做一些愚蠢的事情:我正在做 IO.puts get_info(pid) 所以它试图从句柄信息中调用句柄调用,这很荒谬,但我会试一试,看看它是否会出错。

标签: elixir gen-server


【解决方案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

有一个:sys.get_state/{1,2} 函数可以返回 GenServer 进程的状态,但您不能从该进程中调用它,因为它是一个同步 GenServer 调用,如果进程自己调用它会造成死锁。 (该函数也有一个注释说它只能用于调试。)

【讨论】:

    猜你喜欢
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2011-12-14
    相关资源
    最近更新 更多