2

私は Elixir を学習し、単純な elixir の hello world の例を作成しようとしていますが、「mix run」を実行するとこのエラーが発生し続けます

 (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

コマンド ライン アプリを作成する場合は、このブログ投稿が役立つかもしれません。

それ以外では、スーパーバイザーは通常、1 回限りのプロセスを実行するために使用されるのではなく、後で呼び出すことができる GenServer などのワーカーを開始するために使用されます。たとえば、次のことができます。

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を使用して run メソッドを直接呼び出すことができます-e

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