0

なぜ書けるのか

 (defn factory-foo [] (fn [] (println "foo")))
 (apply (factory-foo) [])

だがしかし:

 (defn factory-bar [] #((println "bar")))
 (apply (factory-bar ) []) ;throws NPE

これはバグですか?

4

1 に答える 1

7

#((println "bar))は、読者によって次のように翻訳されます(fn [] ((println "bar")))- 余分な括弧に注意してください。(println "bar")here は出力barして を返し、外側の括弧のためにnilそれ自体が関数として呼び出されます。実際、それを逆参照しようとすると、NPE が発生します。nilnilnull

これを避けるには、 : 内に余分な括弧のペアをドロップして#(..)ください#(println "bar")

于 2012-07-26T11:31:04.493 に答える