Clojure:将 println 应用于多个字符串打乱输出

问题描述 投票:0回答:3

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

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

我期望以下输出:

foo
bar
baz

但是,我得到这个

foo
 bar
 b a z

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

为什么会出现这样的行为

apply
/
println
?我怎样才能获得所需的输出?

clojure apply println
3个回答
3
投票

前导空格来自于

println
在打印其参数时添加空格。例如。尝试
(println 1 2 3)
- 你会在输出中得到
1 2 3

最后一行之所以出现,是因为您使用的是

apply
apply
将最后一个参数视为集合,并将其项目作为单独的参数传递给目标函数。因此,在这种情况下,您很可能根本不需要
apply

为了实现你想要的,你应该使用类似

(run! print ["foo\n" "bar\n" "baz\n"])
的东西。或者使用
println
并且不要自己添加
\n
,因为
println
会为您完成此操作。


2
投票

另一个想法:

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

0
投票

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

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

有结果

foo
bar
baz

是迄今为止最简单、最清晰的选项。

apply
的目的是如果序列中包含多个项目:

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

但是,

print
直到在每个标记之间添加了
\space
!嚯!

foo
 bar
 baz

因此,如果向量中确实有 3 个参数,则需要其中之一:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.