相关疑难解决方法(0)

为什么Clojure对非法论证说"没有匹配的方法"?

正确使用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的使用查找功能,而另一部分则是参数的类型.(我已经做了一些搜索:这可能是一种多方法吗?)
  • 该方法正在Java类中查找?

一个很好的答案将为我澄清这个过程.

clojure

7
推荐指数
2
解决办法
6403
查看次数

如何获得一个调用Java方法的Fn?

我正在学习Clojure.我写了这段代码来递归遍历一个目录.

(tree-seq #(.isDirectory %1) #(.listFiles %1) (File. "/my-directory"))
Run Code Online (Sandbox Code Playgroud)

为什么我不能.isDirectory在Clojure中用作一流函数?有没有更好的方法来重写此代码?

clojure

3
推荐指数
2
解决办法
132
查看次数

如何将Clojure memfn与Java构造函数一起使用?

我想使用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

2
推荐指数
1
解决办法
356
查看次数

标签 统计

clojure ×3