代码之家  ›  专栏  ›  技术社区  ›  Patrick Bucher

Clojure:将println应用于多个字符串加扰输出

  •  1
  • Patrick Bucher  · 技术社区  · 1 年前

    在Clojure 1.11中,我正在评估这个术语:

    (apply println "foo\n" "bar\n" "baz\n")
    

    我期望得到以下输出:

    foo
    bar
    baz
    

    然而,我得到了 :

    foo
     bar
     b a z
    

    第一行是我需要的。第二行包含前导空格。第三行在每个字母前面都有多余的空格。

    为什么行为 apply / println 像那样,我如何才能得到想要的输出?

    2 回复  |  直到 1 年前
        1
  •  5
  •   Eugene Pakhomov    1 年前

    领先的空间来自于这样一个事实 println 在打印其参数时添加空格。例如,尝试 (println 1 2 3) -你会得到 1 2 3 在输出中。

    最后一行显示为原样,因为您正在使用 apply 申请 将最后一个参数视为集合,并将其项作为单独的参数传递给目标函数。所以在这种情况下,你很可能不需要 申请 完全

    为了实现你想要的,你应该使用 (run! print ["foo\n" "bar\n" "baz\n"]) 。或使用 println 并且不要添加 \n println 为你做那件事。

        2
  •  3
  •   Alan Thompson    1 年前

    由于您正在添加自己的换行符,

    (print (str "foo\n" "bar\n" "baz\n")) 
    

    结果

    foo
    bar
    baz
    

    是迄今为止最简单的&最清晰的选项。目的 apply 如果序列中包含多个项目:

    (apply print [ "foo\n" "bar\n" "baz\n" ] ) 
    

    然而 print till添加到 \space 在每个令牌之间!Doh!

    foo
     bar
     baz
    

    因此,如果你在一个向量中有3个参数,你需要其中一个:

      (print (apply str            ["foo\n" "bar\n" "baz\n"]))
      (print (clojure.string/join  ["foo\n" "bar\n" "baz\n"]))
    

    两者都产生了期望的结果。

        3
  •  2
  •   Harold    1 年前

    另一个想法:

    user> (apply println "foo\n" "bar\n" "baz\n")
    foo
     bar
     b a z 
    
    nil
    user> (print (str "foo\n" "bar\n" "baz\n"))
    foo
    bar
    baz
    nil