Clojure Java互操作:为什么(.setProperty(Properties.)key1";value1";)返回nil,但在doto中包装调用有效?

Clojure Java互操作:为什么(.setProperty(Properties.)key1";value1";)返回nil,但在doto中包装调用有效?,clojure,clojure-java-interop,Clojure,Clojure Java Interop,以下代码返回nil: (.setProperty (Properties.) "key1" "value1") -> nil 然而,以下各项似乎如预期的那样起作用: (doto (Properties.) (.setProperty "key1" "value1")) -> {"key1" "value1"} 为什么会这样?返回上一个值,如果不存在,则返回null。由于它在一个新的Properties实例上运行,因此这是nil(doto x f)在第一个参数位置使用x计算f,然后

以下代码返回nil:

(.setProperty (Properties.) "key1" "value1") -> nil
然而,以下各项似乎如预期的那样起作用:

(doto (Properties.) (.setProperty "key1" "value1")) -> {"key1" "value1"}

为什么会这样?

返回上一个值,如果不存在,则返回null。由于它在一个新的
Properties
实例上运行,因此这是
nil
(doto x f)
在第一个参数位置使用
x
计算
f
,然后返回
x
。在这种情况下,
setProperty
返回的
nil
将被忽略,并返回修改后的
Properties
实例。

返回以前的值,如果不存在,则返回
null
。由于它在一个新的
Properties
实例上运行,因此这是
nil
(doto x f)
在第一个参数位置使用
x
计算
f
,然后返回
x
。在这种情况下,
setProperty
返回的
nil
将被忽略,并返回修改后的
Properties
实例。

第一个表单将求值为方法调用的返回值


作为副作用,第二个表单在运行方法调用后求值为对象实例。

第一个表单求值为方法调用的返回值


第二个表单在作为副作用运行方法调用后计算为对象实例。

您可以通过宏展开来了解它
doto
是宏。如果您尝试将宏扩展到
doto
表单,您可以看到扩展结果,如
(让[G_u85037(Properties.)](.setProperty G_u85037“key1”“value1”)G_u85037:)您可以通过宏扩展来计算它
doto
是宏。如果您尝试将宏扩展到
doto
表单,您可以看到扩展结果,如
(让[G_u85037(属性)](.setProperty G_u85037“key1”“value1”)G_u85037)
:)