在测试java互操作性时,我执行了-(macroexpand-1 '(.toUpperCase "deepak"))
,输出是(. "deepak" toUpperCase)
现在,我知道.
执行某种操作。
当我使用(clojure.repl/doc .)
为.
打印doc
时,我得到了的输出
-------------------------
.
(.instanceMember instance args*)
(.instanceMember Classname args*)
(Classname/staticMethod args*)
Classname/staticField
Special Form
The instance member form works for both fields and methods.
They all expand into calls to the dot operator at macroexpansion time.
我无法理解.
所期望的参数模式。例如.instanceMember
当我们执行(. "deepak" toUpperCase)
时,参数"deepak"
和toUpperCase
如何映射到上述模式?
表达式(. "deepak" toUpperCase)
的实例名、类名和实例是什么?
您将在这里深入研究Clojure的内部细节。这通常是不需要的(通常没有用处(。
像CCD_ 13这样的表达式调用方法";toUpperCase";在java.lang.String对象"deepak"
上,例如
(.toUpperCase "deepak") => "DEEPAK"
编译器在内部将上述内容转换为
(. "deepak" toUpperCase) => "DEEPAK"
这当然具有相同的结果。您可以在the Dot Special Form 的文档中找到更多信息
文档有时很难阅读,但你可以通过一点模式匹配来解读它。在上面的例子中,.toUpperCase
是";。instanceMember";并且CCD_ 16是"0";实例";即CCD_ 17类型。
对于(.getName String)
,符号String
(java.lang.String
的简写(是"0";类名"。在文档中,args*
是一个类似regex的简写,表示可能需要零个或多个参数(前面的示例需要零个参数(。
你还想完成什么吗?
p.S.
"如果有疑问,请询问编译器">
当我学习Clojure时,我也遇到了类似的问题,被文档&不完整或含糊不清的书。后来我了解到它要快得多;尝试简单的实验来填补空白更具教育意义。
我认为简单的代码片段比REPL:更容易/更快
(ns tst.demo.core
(:use tupelo.core tupelo.test))
(dotest
(spyx (.toUpperCase "deepak"))
(spyx (. "deepak" toUpperCase))
(spyx (type "deepak"))
)
使用我最喜欢的模板项目,结果
-----------------------------------
Clojure 1.10.3 Java 17.0.1
-----------------------------------
Testing tst.demo.core
(.toUpperCase "deepak") => "DEEPAK"
(. "deepak" toUpperCase). => "DEEPAK"
(type "deepak") => java.lang.String
此外,
(.getName String) => "java.lang.String"
(.getName java.lang.String). => "java.lang.String"
注意是否有双引号。
文档字符串可能具有误导性,这可能是您感到困惑的原因。
有两种不同的方式来访问Java互操作;点";形式。有成员访问(.toUpperCase "deepak")
,有点特殊形式(. "deepak" toUpperCase)
。您显示的docstring用于Member访问(.toUpperCase "deepak")
,而您看到的表单是点特殊表单(. "deepak" toUpperCase)
。在大多数情况下,最好使用interop的成员访问样式。在内部,interop的Member访问样式被转换为点特殊形式(正如您在执行macroexpand-1
时发现的那样(。
因此,在(.toUpperCase "deepak")
的情况下,使用成员访问(.instanceMember instance)
的文档字符串,对应关系为:
instanceMember
映射到toUpperCase
instance
映射到"deepak"