正确使用Character/isWhitespace的用法包括:
(Character/isWhitespace \a) => false
(Character/isWhitespace \ ) => true
Run Code Online (Sandbox Code Playgroud)
但是,我的第一次尝试是这个,我发现错误令人困惑.
(Character/isWhitespace "")
=> IllegalArgumentException No matching method found: isWhitespace
=> clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:80)
Run Code Online (Sandbox Code Playgroud)
这IllegalArgument部分是有道理的,但为什么它说"找不到匹配的方法"?显然,该功能确实存在.
我问这个问题的原因是我是Clojure的新手,并认为我从根本上误解了一些东西.
当我输入时(Character/isWhitespace \a),我认为我所说的是:"我知道有一个Character命名空间,并且在其中有一个被调用的函数isWhitespace,我想调用该函数并传入\a".
在这个心智模型上,我上面的结果令人困惑,因为Clojure似乎在说,"每当你给我一个这个函数不接受的参数类型时,我就会假装该函数不存在." 例如,"你不允许混合砖块,所以如果你试试,我会给你一个BlenderDoesntExist错误." 这很奇怪.
一些答案似乎暗示了这一点
Character/isWhitespace只是一部分的什么Clojure的使用查找功能,而另一部分则是参数的类型.(我已经做了一些搜索:这可能是一种多方法吗?)一个很好的答案将为我澄清这个过程.
我正在学习Clojure.我写了这段代码来递归遍历一个目录.
(tree-seq #(.isDirectory %1) #(.listFiles %1) (File. "/my-directory"))
Run Code Online (Sandbox Code Playgroud)
为什么我不能.isDirectory在Clojure中用作一流函数?有没有更好的方法来重写此代码?
我想使用Java构造函数作为一流的Clojure函数.我的用例是将一系列字符串转换为一系列Java对象,这些对象具有一个带有单个字符串的构造函数:
简单的Java对象:
public class Foo {
public Foo(String aString){
// initialize the Foo object from aString
}
}
Run Code Online (Sandbox Code Playgroud)
在Clojure中我想这样做:
(defn make-foo (memfn Foo. a-string))
(apply make-foo '("one" "two" "shoe"))
Run Code Online (Sandbox Code Playgroud)
apply应返回从Strings创建的Foo对象列表,但我得到了这个:
IllegalArgumentException No matching method found: org.apache.hadoop.io.Text. for class java.lang.String clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)
Run Code Online (Sandbox Code Playgroud) clojure ×3