gpt4 book ai didi

io - 如何在 Elixir 中写入标准输入?

转载 作者:行者123 更新时间:2023-12-01 17:29:36 25 4
gpt4 key购买 nike

我有这个模块用于检查数字奇偶校验:

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()函数的输入。

最佳答案

如果您想写入 stdin(相当于伪造 CLI 输入),您非常需要一种在不同系统进程之间交换信息的方法。 Porcelain做得很好:

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 好得多。或者,如果您不需要 stdin,您应该在其 own Elixir node 上运行每个模块。 :

iex --sname parity -S mix

然后在您的OtherModule中您可以编写如下内容:

pid = Node.spawn_link :"parity@computer-name", fn -> ... end

关于io - 如何在 Elixir 中写入标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46995433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com