【发布时间】:2013-11-04 14:33:31
【问题描述】:
Character/isWhitespace 的正确用法包括:
(Character/isWhitespace \a) => false
(Character/isWhitespace \ ) => true
但是,我的第一次尝试是这样,我发现错误令人困惑。
(Character/isWhitespace "")
=> IllegalArgumentException No matching method found: isWhitespace
=> clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:80)
IllegalArgument 部分是有道理的,但为什么它说“找不到匹配方法”?显然该功能确实存在。
澄清
我问这个问题的原因是我是 Clojure 的新手,并且认为我从根本上误解了一些东西。
当我输入 (Character/isWhitespace \a) 时,我认为我的意思是:“我知道有一个 Character 命名空间,其中有一个名为 isWhitespace 的函数,我想要调用该函数并传入\a"。
在这个心智模型上,我上面的结果令人困惑,因为 Clojure 似乎在说,“只要你给我一个这个函数不接受的参数类型,我就会假装这个函数不存在。 "例如,“你不允许混合砖块,所以如果你尝试,我会给你一个 BlenderDoesntExist 错误。”这很奇怪。
有些答案似乎暗示了这一点
- 名称
Character/isWhitespace只是Clojure 用于查找函数的一部分,另一部分是参数的类型。 (我进行了更多搜索:这可能是一种多方法吗?) - 正在查找 Java 类的方法?
一个很好的答案会为我阐明这个过程。
【问题讨论】:
-
我猜是因为没有接受
String的isWhitespace。 -
添加了编译器演练点宏解释过程,有没有清楚的告诉我
-
命名空间/函数通常不以大写字母开头,也不拼写为驼峰式。您可以通过尝试在 repl 中将其用作独立值来区分真正的 clojure 函数和 java 方法 - 您将收到方法错误,对于函数,它将显示函数的内部表示。
标签: clojure