管道连接到String.trim时,托架返回没有被修剪

时间:2018-03-16 15:50:57

标签: string elixir

我正在修补学习Elixir来自Ruby背景。今天早上我注意到,当我将String.trim()的结果传递给IO.puts()时,字符串打印出来,回车原封不动

token = IO.gets "enter your token" |> String.trim() |> IO.puts()

返回"string123\n"

但是,如果我做这样的事情 - >

token = IO.gets "enter your token" |> String.strip()
IO.puts(token)

然后输出为"string123"

为什么我的第一个解决方案不是修剪回车?

1 个答案:

答案 0 :(得分:2)

TLDR:这是竞争条件优先问题。你得到的是调用IO.gets/2完成最后的结果。

实际上,第一行做了一些奇怪的任务。 IO.puts/2 始终返回:ok,它不会返回字符串,而是将其吐出到stdout。会发生什么,(我按顺序执行函数):

#       6       1                  2  3             4  5
token = IO.gets "enter your token" |> String.trim() |> IO.puts()

# it’s the same as:
token = IO.gets("enter your token" |> String.trim() |> IO.puts())

有人可能会在IO.gets/2的参数周围加上括号,但这只会将问题转移到代码的另一部分。

token = IO.gets("enter your token") |> String.trim() |> IO.puts()
#⇒ enter your token123
#  123
# :ok

token
#⇒ :ok

到目前为止,String.trim/1完美无缺。您需要的是将返回的结果分配给token变量:

token = "enter your token" |> IO.gets() |> String.trim()

现在,您可以在token变量中获得修剪后的值。