2017-10-28 1 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'를 호출하면 결국'IO.gets/2'를 호출하는'Parity.start/0'을 호출합니다. 이제 프로그램이 앉아서 입력을 기다리고 있으며 실제로 숫자를 생성하는 부분에 코드 실행을 계속할 수 없습니다. –

+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 꽤 잘 있다고한다. 도자기는 을 많이 가지고 있으며System.cmd/3보다 처리가 좋습니다. 당신이 표준 입력 필요하지 않은 경우 또는, 당신은 그들의 own Elixir node에 각 모듈을 실행해야합니다

다음
iex --sname parity -S mix 

OtherModule 당신과 같이 쓸 수 있습니다 :

pid = Node.spawn_link :"[email protected]", fn -> ... end 
관련 문제