【问题标题】:Carriage return not being trimmed when piping to String.trim管道到 String.trim 时回车未修剪
【发布时间】:2022-03-11 08:03:19
【问题描述】:

我正在努力学习来自 Ruby 背景的 Elixir。我注意到,当我将 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"

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

【问题讨论】:

    标签: string elixir


    【解决方案1】:

    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 变量中获得修剪后的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多