Как я передаю статический метод аккомпанировать в clojure?

Кажется, как будто у меня есть проблемы при доступе Integer.parseInt в аккомпанементе. Я могу обычно получать доступ к нему как это:

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

Но если я поместил его в аккомпанемент, я получаю ошибку:

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.parseInt как это? И есть ли лучший способ преобразовать вектор символов в int?

24
задан Jason Baker 5 February 2010 в 17:00
поделиться

2 ответа

Клоюрные функции являются java-методами, но java-методы не являются клоюрными функциями Например, клоюрные функции имеют мета-данные и тому подобное. Если вы хотите использовать метод java, для которого вызывается функция Clojure, то у вас есть два варианта его обёртывания, memfn и fun или #( ) memfn - это устаревшая функция, которая обёртывала метод java в функцию clojure (хорошо знать, что он существует, даже если он не используется часто). Общепринятым способом обёртывания java-методов является:

#(. instance method arg1 argN)  

или для статических методов

#(Class/MethodName arg1 argN)
28
ответ дан 28 November 2019 в 23:51
поделиться
(def vec-to-int (comp #(Integer/parseInt %) (partial apply str)))

Или

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

частичный и comp обычно не так лаконичны в Clojure, как использование # () , чтобы сделать анонимный fn. Лично я бы написал это так:

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

Вы можете сделать это с помощью простого def , но что вы получите, используя def вместо defn , правда? ? Использование def скрывает тот факт, что вы определяете функцию. defn также устанавливает для вас дополнительные метаданные (arglists), которых не делает def .

В любом случае, это более общий способ делать то, что вы делаете:

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

И еще более общий:

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

Зависит от того, хотите ли вы иметь возможность обрабатывать вещи, отличные от целых чисел.

7
ответ дан 28 November 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: