2016-03-17 3 views
0

Следующий код возвращает NIL:Java Interop: Почему (.setProperty (Свойства.) "Key1" "value1") возвращает ноль, но обертывание вызова в doto работает?

(.setProperty (Properties.) "key1" "value1") -> nil 

Ниже, однако, кажется, работает как задумано:

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

Почему?

+1

Вы можете понять это путем макрорасширения. 'doto' - макрос. Если вы попытались выполнить макрообъем в форме 'doto', вы можете увидеть результат расширения, как этот' (let [G__85037 (Свойства.)] (.setProperty G__85037 "key1" "value1") G__85037) ':) –

ответ

4

.setProperty возвращает предыдущее значение, или null, если его не было. Так как он работает на новом экземпляре Properties, это nil. (doto x f) оценивает f с x в позиции первого аргумента, а затем возвращает x. В этом случае nil, возвращенный setProperty, игнорируется и возвращается экземпляр Properties.

1

Первая форма вычисляет возвращаемое значение вызова метода.

Вторая форма оценивает экземпляр объекта после запуска вызова метода в качестве побочного эффекта.