在 Clojure 1.11 中,我正在评估这个术语:
(apply println "foo\n" "bar\n" "baz\n")
我期望以下输出:
foo
bar
baz
但是,我得到这个:
foo
bar
b a z
第一行是我需要的。第二行包含一个前导空格。第三行每个字母之前有一个多余的空格。
为什么会出现这样的行为
apply
/println
?我怎样才能获得所需的输出?
前导空格来自于
println
在打印其参数时添加空格。例如。尝试 (println 1 2 3)
- 你会在输出中得到 1 2 3
。
最后一行之所以出现,是因为您使用的是
apply
。 apply
将最后一个参数视为集合,并将其项目作为单独的参数传递给目标函数。因此,在这种情况下,您很可能根本不需要 apply
。
为了实现你想要的,你应该使用类似
(run! print ["foo\n" "bar\n" "baz\n"])
的东西。或者使用 println
并且不要自己添加 \n
,因为 println
会为您完成此操作。
另一个想法:
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
由于您要添加自己的换行符,
(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"]))
两者都会产生期望的结果。