为什么io:get“line return”\";在erlang shell中?

为什么io:get“line return”\";在erlang shell中?,erlang,erlang-shell,Erlang,Erlang Shell,在erlang shell中使用io:getline(“提示符”)时,函数立即返回,返回值为“\n” 但正如在另一个线程中建议的那样,正确地执行以下从标准io读取的操作 spawn(fun() -> timer:sleep(100),io:get_line("prompt") end). 等待用户输入并从标准io(shell)读取。有人提到这是一个比赛条件。有谁能告诉我为什么会这样,以及如何从erlang shell读取值 io:get\u line/1和io:get\u line/2

在erlang shell中使用io:getline(“提示符”)时,函数立即返回,返回值为“\n”

但正如在另一个线程中建议的那样,正确地执行以下从标准io读取的操作

spawn(fun() -> timer:sleep(100),io:get_line("prompt") end). 

等待用户输入并从标准io(shell)读取。有人提到这是一个比赛条件。有谁能告诉我为什么会这样,以及如何从erlang shell读取值

io:get\u line/1io:get\u line/2每次都以\n返回数据

获取行(提示)->数据|服务器无数据()

其中:

资料

行中以LF结尾的字符(或文件结尾)。如果 IO设备支持Unicode,数据可能代表更大的码点 大于255(拉丁1范围)。如果I/O服务器设置为传递 二进制文件,它们将以UTF-8编码(无论IO 设备实际上是否支持Unicode)

在第一种情况下,您得到了\n,在第二种情况下,尝试获得
io:get\u line
的结果:

spawn(fun() -> 
      timer:sleep(100), 
      Result = io:get_line("prompt"), 
      io:format("Result: ~p~n", [Result]) 
end).

让我们把它分解…

为什么
io:get\u line/1
返回一个
\n

> Data = string:strip(io:get_line("Prompt:"), right, $\n).
Prompt:TheStringIEntered
"TheStringIEntered"
> Data.
"TheStringIEntered"
io:get\u 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"
请注意,此处的值(数据)始终为字符串类型。可以将其转换为其他类型,但始终以字符串开头

为什么
spawn(fun()->计时器:sleep(100),io:get_line(“prompt”)结束)。
行为不同?

> Data = string:strip(io:get_line("Prompt:"), right, $\n).
Prompt:TheStringIEntered
"TheStringIEntered"
> Data.
"TheStringIEntered"

因为
spawn
生成一个临时接管shell的新进程。一旦该进程被字符串设置为
中心,它也将到达其生命周期的终点。因此,它在没有将其返回值(
字符串居中
)打印到shell的情况下死亡。

我理解它返回“\n”的原因。我的问题是,为什么案例1不等待用户输入,而是立即返回。
io:get\u line()
将仅在命令行中以上述方式使用,否则,如果您想在应用程序或模块中使用它,则必须将其设置为
io:get\u line(File\u descriptor,”)
,它应该返回当前行的内容,其中每行都以换行符或
\n
终止,将其放入for循环中,以便逐行读取文件。我不知道,但在我的计算机上,它可以按预期工作。也许你应该提供更多关于你的安装和架构的信息,我同意amd64 erlang r15b01 smp emabledi上的@niahoo.ubuntu 13.04,对不起。我想我没有说清楚。我了解如何使用io:get_line。但是在我的计算机上使用它时,会发生这种行为
3>Data=io:get\u line(“提示符:”)。提示:“\n”4>
REPL等待您输入字符串,然后返回。但是在我的例子中,在调用io:get_line()之后,我无法输入字符串,将打印提示,然后返回值只是一个\n。我想知道为什么会发生这种情况。@draklor40尝试从源代码编译Erlang。