我很好奇为什么这样有效(正如我在阅读the documentation on the dot special form后所期望的那样):
(map #(. % isInstance {}) [clojure.lang.IPersistentMap])
返回:
(true)
但这不是:
(. clojure.lang.IPersistentMap isInstance {})
我收到错误,“没有匹配的方法:isInstance”。该表单与上面的map
函数调用完全相同,但在map
之外,它不起作用。为什么呢?
答案 0 :(得分:6)
.
(点)形式是最奇怪的形式。我不确定我是否会很好地解释它,但试试吧。
每docs:
如果第一个操作数是解析为类名的符号,则该访问被视为指定类的静态成员。请注意,根据JVM规范,嵌套类被命名为EnclosingClass $ NestedClass。 否则,它被假定为实例成员,并且第一个参数被计算以生成目标对象。
强调我的。
所以你用(. clojure.lang.IPersistentMap isInstance {})
- clojure.lang.IPersistentMap
解析了第一个案例,并且假设整个表达式是静态方法调用。
在map
情况下,符号被评估(重点部分),在传递给匿名函数之前求值为clojure.lang.IPersistentMap
类对象,整个表达式是对该类的实例方法调用
因此可归结为这样的事实:在一个地方,clojure.lang.IPersistentMap
被用作引用类名的符号,而在另一个地方被用作评估类对象的东西。
另见here:
请注意,类名通常表示类对象,但是以某些特殊形式特殊处理,例如: ''和新的。