Clojure gen-class это ключевое слово
Можно ли ссылаться на ключевое слово this в Java из метода gen-класса?
Я пытаюсь реализовать ответ Даредесма здесь, в Clojure. Однако, когда я пытаюсь использовать "this" в функции run, я получаю "java.lang.RuntimeException: Невозможно разрешить символ: это в этом контексте".
(gen-class
:name ClipboardListener
:extends java.lang.Thread
:implements [java.awt.datatransfer.ClipboardOwner]
:prefix ClipboardListener-
:methods [[takeOwnership [Transferable] void]])
(def systemClipboard (.getSystemClipboard (java.awt.Toolkit/getDefaultToolkit)))
(defn ClipboardListener-run []
(let [transferable (.getContents systemClipboard this)]
(.takeOwnership transferable)))
(defn ClipboardListener-lostOwnership [clipboard trasferable] (prn "hit lost"))
(defn ClipboardListener-takeOwnership [transferable] (prn "hit take"))
(defn processClipboard [transferable clipboard] (prn "hit process"))
Примечание: это мой первый раз, когда я генерирую Java-классы в Clojure, поэтому любые отзывы и пожелания приветствуются.
1 ответ
Методы экземпляра могут принимать неявный аргумент self как первый аргумент. Итак, чтобы взять ваш пример:
(defn ClipboardListener-run [this]
(let [transferable (.getContents systemClipboard this)]
(.takeOwnership transferable)))
Обратите внимание this
аргумент:)
То же самое касается любого метода экземпляра, например:
(defn ClipboardListener-toString [this]
"override Object#toString with something cool")
Посмотрите на это (не каламбур) для получения дополнительной информации о gen-class.
Также рассмотрим reify
для таких случаев, как Runnable
, Callable
и т. д., где вам просто нужно реализовать интерфейс с небольшим количеством элементов.