2

我正在学习 Elixir 并尝试编写一个简单的 elixir hello world 示例,但是当我执行“混合运行”时,我一直遇到这个错误

 (Mix) Could not start application collector:
       Collector.start(:normal, []) returned an error:
       shutdown: failed to start child: Collector.Sample
(EXIT) nil

我究竟做错了什么?这是我的代码减去 mix.exs 和其他非关键文件

defmodule Collector do
  use Application

  def start(_type, _args) do
    Collector.Supervisor.start_link
  end
end

defmodule Collector.Supervisor do
  use Supervisor

  def start_link do
    Supervisor.start_link(__MODULE__, :ok)
  end

  def init(:ok) do
    children = [
      supervisor(Collector.Sample, [])
    ]

    supervise(children, strategy: :one_for_one)
  end
end

defmodule Collector.Sample do
  use Application

  def start_link do

  end

  def run do
    IO.puts "Hello World"
  end

end

当我在控制台中运行“mix run”时,我只想转储“Hello World”,但我不知道如何或在哪里调用该run()方法。谢谢

4

1 回答 1

4

如果您想构建一个命令行应用程序,也许这篇博文会对您有所帮助。

除此之外,监督者通常不用于运行一次性流程,而是用于启动像 GenServers 这样以后可以调用的工作人员。例如,您可以:

defmodule Collector.Supervisor do
  # ...

  def init(:ok) do
    children = [
      worker(Collector.Sample, [])
    ]

    supervise(children, strategy: :one_for_one)
  end
end

然后实现Collector.SampleGenServer

defmodule Collector.Sample do
  use GenServer

  # Client API

  def start_link do
    GenServer.start_link(__MODULE__, [], name: __MODULE__)
  end

  def run do
    GenServer.call __MODULE__, :run
  end

  # GenServer callbacks

  def handle_call(:run, _from, state) do
    IO.puts "Hello World"
    {:reply, :ok, state}
  end
end

mix run您可以使用-e标志直接调用 run 方法

mix run -e 'Collector.Sample.run'
于 2014-12-05T10:00:52.463 回答