2017-10-28 25 views
1

私は数字のパリティチェックするために、このモジュールを持っている:エリクサーの標準入力に書き込む方法は?

defmodule Parity do 
    def start() do 
    continue() 
    end 

    defp continue() do 
    get_number() 
    |> parse() 
    |> even?() 
    |> print_output() 
    continue() 
    end 

    defp get_number() do 
    IO.gets("Type a number: ") 
    end 

    defp parse(input) do 
    String.trim(input) 
    |> Integer.parse 
    end 

    defp even?({ number, _ }) do 
    Integer.mod(number, 2) == 0 
    end 

    defp print_output(_is_even = true) do 
    IO.puts("This number is even!") 
    end 

    defp print_output(_is_odd) do 
    IO.puts("This number is odd!") 
    end 
end 

をそして、それは次のように動作します。

$ mix run -e Parity.start 
Type a number: 4 
This number is even! 
Type a number: 3 
This number is odd! 
Type a number: 68 
This number is even! 
Type a number: 1 
This number is odd! 
Type a number: ... 

今私は書き込み番号にできるようになる他のモジュールを、持っていたいですParityモジュールの標準入力。ですから、Parity.start()を実行してからIO.gets()に番号を渡す必要があります。 私はこのような何か試してみました:

defmodule Bot do 
    def start() do 
    Parity.start() 
    provide_number() 
    end 

    defp provide_number() do 
    random_number() 
    |> IO.puts 
    provide_number() 
    end 

    defp random_number() do 
    Enum.random(0..100) 
    end 
end 

をそして、それは動作しません。

モジュールはParityモジュールのみ起動しますが、provide_number()機能からの入力はありません。

+0

を単一のスレッド。 'Bot.start/0'を呼び出すと' Parity.start/0'が呼び出され、最終的に 'IO.gets/2'が呼び出されます。あなたのプログラムは、座って入力を待っているので、実際に数字を生成している部分にコード実行を継続することはできません。 –

+0

あなたは何をしたいでしょうか?テスト目的ですか? –

+0

@RyanBigg人間の入力を別のモジュールでシミュレートしたいだけです。 – Walerian

答えて

1

stdin(CLI入力を偽装するのと同じように)に書きたい場合は、さまざまなシステムプロセス間で情報を交換する方法が必要です。

テストを行わずに書かれた
defmodule OtherModule do 
    alias Porcelain.Process, as: Proc 
    alias Porcelain.Result 

    proc = %Proc{pid: pid} = 
    Porcelain.spawn_shell("mix run -e Parity.start", in: :receive, out: {:send, self()}) 

    Proc.send_input(proc, "1") 
    receive do 
    {^pid, :data, :out, data} -> IO.inspect data #=> "This number is odd!" 
    end 
end 

、それはあなたがラフなアイデアを与える必要があります。Porcelainは、かなりよくありません。磁器は、よりものほうがよく、です。あなたはSTDINを必要としない場合は別の方法として、あなたはそれらのown Elixir node上の各モジュールを実行する必要があります。

iex --sname parity -S mix 

次に、あなたのOtherModuleにあなたが何か書くことができます:あなたはすべてでこれを実行している

pid = Node.spawn_link :"[email protected]", fn -> ... end 
関連する問題