我正在修补学习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"
为什么我的第一个解决方案不是修剪回车?
答案 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
变量中获得修剪后的值。