仍然是 Elixir 的新手。到目前为止,我的理解是,我们使用
input = IO.read(:stdio,:line)
使用标准输入,并使用 IO.puts(line)
将一行写入标准输出。现在我在 elexir hexdocs 中找到了以下示例,用于在 stdout 上生成 stdin 的大写版本:
stream = IO.stream(:stdio, :line)
for line <- stream, into: stream do
String.upcase(line) <> "\n"
end
这是我对这段代码的部分理解:第一行告诉我们
stream
是一个代表所有stdin的Stream。这是一个 Enumerable,因此推导式 for line <- stream
会连续生成各个行。
令我困惑的是
into: stream
条款。这意味着上面定义的相同标准输入流现在用作收集器,并且我没有看到任何实际将某些内容放入标准输出的内容(没有IO.puts
)。
stream
是否以某种方式神秘地同时代表标准输入和标准输出?
是的,您的分析是正确的(这就是为什么它被命名为
:stdio
而不是:stdin
或:stdout
)。
要检查这一点,您必须从 IO 文档(“Elixir 提供 :stdio 和 :stderr 作为 Erlang 的 :standard_io 和 :standard_error 的快捷方式。”)开始到 Erlang io 文档(“默认情况下,发送的所有 I/O to standard_io 将出现在生成调用进程的节点的用户 I/O 设备中。”)