2017-03-15 9 views
2

gen 클래스 방법에서 Java의 'this'키워드를 참조 할 수 있습니까?Clojure gen-class이 키워드

저는 Clojure에서 daredesm의 대답 here을 구현하려고합니다. 그러나 run 함수에서 'this'를 사용하려고하면 "java.lang.RuntimeException :이 컨텍스트에서 symbol : this를 해결할 수 없습니다."라는 메시지가 나타납니다.

(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")) 

참고 : 이것은 Clojure에서 처음으로 Java 클래스를 생성하므로 일반적인 피드백/리소스를 크게 높이 평가합니다.

답변

3

인스턴스 메소드는 첫 번째 인수로 암시 적 'self'인수를 취할 수 있습니다. 그래서 예를 취할 :

(defn ClipboardListener-run [this] 
    (let [transferable (.getContents systemClipboard this)] 
    (.takeOwnership transferable))) 

참고 this 인수 :

같은 어떤 인스턴스 메소드에 간다, 예를 들면 :

(defn ClipboardListener-toString [this] 
    "override Object#toString with something cool") 

this 봐 (의도 웃기)가에 대한 gen-class에 대한 자세한 정보.

또한 Runnable, Callable, e.t.c와 같은 경우에는 reify을 사용하십시오. 여기서는 small-ish 인터페이스 만 구현하면됩니다.

+0

마치 작동하는 것 같습니다. 이전에 다른 예제에서이 예제를 보았지만 Java에서 메서드 시그니처의 일부라고 가정했습니다. 기존 메서드를 재정의 할 때부터 옵션이 아닙니다. 감사! – Porthos3