在erlang shell中使用io:getline(“prompt”)时,函数立即返回,返回值为“\ n”
io:get_line("prompt").
prompt
"\n"
但正如在另一个线程中建议的那样,正确执行以下从standard_io读取。
spawn(fun() -> timer:sleep(100),io:get_line("prompt") end).
等待用户输入并从标准io(shell)读取。有人提到它是一种竞争条件。任何人都可以告诉我为什么会这样,怎么可能从erlang shell读取一个值?
答案 0 :(得分:2)
io:get_line / 1 和 io:get_line / 2 每次都会返回 \ n 的数据。
get_line(Prompt) -> Data | server_no_data()
其中:
数据
行中的字符以LF (或文件末尾)结尾。如果 IO设备支持Unicode,数据可能代表更大的代码点 超过255(latin1范围)。如果I / O服务器设置为交付 二进制文件,它们将以UTF-8编码(无论是否为IO 设备实际上是否支持Unicode。)
在第一种情况下,您获得 \ n ,并尝试在第二种情况下获得io:get_line
的结果:
spawn(fun() ->
timer:sleep(100),
Result = io:get_line("prompt"),
io:format("Result: ~p~n", [Result])
end).
答案 1 :(得分:0)
让我们分解......
为什么io:get_line/1
会返回\n
?
io:get_line/1
返回“行”,\n
(“行尾”或“新行”)与您输入的字符串一起构成一行。
> io:get_line("Prompt:").
Prompt:TheStringIEntered
"TheStringIEntered\n"
如何从Erlang shell中读取值?
> Data = string:strip(io:get_line("Prompt:"), right, $\n).
Prompt:TheStringIEntered
"TheStringIEntered"
> Data.
"TheStringIEntered"
请注意,此处的值(Data)始终为字符串类型。您可以将其转换为其他类型,但始终以字符串开头。
spawn(fun() -> timer:sleep(100),io:get_line("prompt") end).
为什么表现不同?
因为spawn
会生成一个暂时接管shell的新进程。一旦这个过程得到TheStringIEntered
,它也会达到其生命的终点。所以它在没有打印到shell的返回值(TheStringIEntered
)时就会死掉。