如何在 clojure 中将静态方法传递给 comp?

发布于 2024-08-21 04:18:57 字数 475 浏览 3 评论 0原文

似乎我在访问 comp 中的 Integer.parseInt 时遇到问题。我可以像这样正常访问它:

user=> (Integer/parseInt "123")
123

但如果我把它放在 comp 中,我会收到一个错误:

user=> (def vect-to-int (comp Integer/parseInt (partial apply str)))
java.lang.Exception: Unable to find static field: parseInt in class java.lang.Integer (NO_SOURCE_FILE:3)

在我看来,它在应该寻找方法时试图在 Integer 上找到一个字段。我怎样才能像这样使用Integer.parseInt?有没有更好的方法将字符向量转换为int?

It seems as though I'm having problems accessing Integer.parseInt in comp. I can access it normally like this:

user=> (Integer/parseInt "123")
123

But if I put it in comp, I get an error:

user=> (def vect-to-int (comp Integer/parseInt (partial apply str)))
java.lang.Exception: Unable to find static field: parseInt in class java.lang.Integer (NO_SOURCE_FILE:3)

It sounds to me like it's trying to find a field on Integer when it should be looking for a method. How can I use Integer.parseInt like this? And is there a better way to convert a vector of chars into an int?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦里的微风 2024-08-28 04:18:57

Clojure 函数是 java 方法,但 java 方法不是 clojure 函数 例如,Clojure 函数具有元数据等。如果你想使用一个调用 Clojure 函数的 java 方法,那么你有两种选择来包装它,memfnfun 或 #( ) memfn 已经过时了将 java 方法包装在 clojure 函数中的函数(知道它存在是件好事,即使它不经常使用)。包装 java 方法的普遍接受的方法是:

#(. instance method arg1 argN)  

或 对于静态方法

#(Class/MethodName arg1 argN)

Clojure functions are java methods but java methods are not clojure functions For instance Clojure functions have meta-data and such. If you want to use a java method where a Clojure function is called for then you have two choices in wrapping it up, memfn and fun or #( ) memfn is an obsolete function that wrapped up a java method in a clojure function (its good to know it exists even if its not used often). The generally accepted way to wrap up java methods is:

#(. instance method arg1 argN)  

or for static methods

#(Class/MethodName arg1 argN)
时光礼记 2024-08-28 04:18:57
(def vec-to-int (comp #(Integer/parseInt %) (partial apply str)))

或者

(def vec-to-int #(Integer/parseInt (apply str %)))

partialcomp 在 Clojure 中通常不像使用 #() 来创建匿名 fn 那样简洁。就我个人而言,我会这样写:

(defn vec-to-int [x] (Integer/parseInt (apply str x)))

您可以使用普通的 def 来完成此操作,但是使用 def 而不是 defn 会得到什么,真的?使用 def 掩盖了您正在定义函数的事实。 defn 还为您设置 def 没有的附加元数据(参数列表)。

无论如何,这是一种更通用的方法来完成您正在做的事情:

(def vec-to-int #(bigint (apply str %)))

并且更通用:

(def vec-to-int #(read-string (apply str %)))

取决于您是否希望能够处理整数以外的事物。

(def vec-to-int (comp #(Integer/parseInt %) (partial apply str)))

Or

(def vec-to-int #(Integer/parseInt (apply str %)))

partial and comp usually aren't as succinct in Clojure as using #() to make an anonymous fn. Personally I'd write it this way:

(defn vec-to-int [x] (Integer/parseInt (apply str x)))

You can do this with plain def, but what do you gain using def instead of defn, really? Using def obscures the fact that you're defining a function. defn also sets up additional metadata for you (arglists) that def doesn't.

In any case, this is a more general way to do what you're doing:

(def vec-to-int #(bigint (apply str %)))

And still more general:

(def vec-to-int #(read-string (apply str %)))

Depends whether you want to be able to handle things other than Integers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文