如果我在REPL中运行以下代码
(let [f '.startsWith] (f "abab" "a"))
Run Code Online (Sandbox Code Playgroud)
它被评估为"a"而不是"true".有人可以解释一下这个令人惊讶的结果吗?
实际上,真正的代码,我想做的工作如下.
(defn set-up-bean! [bean functions-and-parameters]
(doseq [[f p] functions-and-parameters]
(f bean p))
(.init bean))
Run Code Online (Sandbox Code Playgroud)
我想要实现的是,使以下两个函数调用做同样的事情.
(set-up-bean! bean [['.setMember "a"]])
Run Code Online (Sandbox Code Playgroud)
和
(do
(.setMember bean "a")
(.init bean))
Run Code Online (Sandbox Code Playgroud)
一种传统方法是使用匿名函数
(let [f (fn [a b] (.startsWith ^String a ^String b))] (f "abab" "a"))
Run Code Online (Sandbox Code Playgroud)
...因为这允许您根据需要键入提示参数.你也可以考虑memfn:
(let [f (memfn startsWith String)] (f "abab" "a"))
Run Code Online (Sandbox Code Playgroud)
无论如何 - 点符号是互操作的语法糖,而不是提供真正的可调用函数.