Clojure Java互操作:为什么(.setProperty(Properties.)key1";value1";)返回nil,但在doto中包装调用有效?
以下代码返回nil: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,然后
(.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)
:)