У меня есть оператор Clojure proxy
, который становился все более и более запутанным, поэтому я решил попробовать выделить код переопределения метода beginDrag
из оператора proxy
, например:
(defn enhanced-start-drag
""
[pie]
(let [pobj (. pie getPickedNode)
pobj-coll (seq (.. pie getInputManager
getKeyboardFocus getSelection))]
(println pobj)
(println pobj-coll)
(println "----------")
(proxy-super startDrag pie))) ; THIS IS LINE 94 (SEE ERROR MSG)
(defn custom-selection-event-handler [marqueeParent selectableParent]
(proxy [PSelectionEventHandler] [marqueeParent selectableParent]
(decorateSelectedNode [node]
(let [stroke-color (Color/red)]
(.setStrokePaint node stroke-color)))
(undecorateSelectedNode [node]
(let [stroke-color (Color/black)]
(.setStrokePaint node stroke-color)))
(startDrag [pie] ; pie is a PInputEvent
(enhanced-start-drag pie))
(endStandardSelection [pie] ; pie is a PInputEvent
(let [pobj (.getPickedNode pie)
slip (. pobj getAttribute "slip")
]
(swap! *last-slip-clicked*
(fn [x] slip))))))
Я получаю следующую ошибку компиляции:
cd /Users/gw/tech/clojurestuff/cljprojects/infwb/src/infwb/
1 compiler notes:
Unknown location:
error: java.lang.Exception: Unable to resolve symbol: this in this context
core.clj:94:5:
error: java.lang.Exception: Unable to resolve symbol: this in this context
(core.clj:94)
Compilation failed.
Как только я восстанавливаю тело enhanced-start-drag
в тело оператора proxy
, все работает.
Мой вопрос: Есть ли способ перенести беспорядочные детали в отдельную функцию для улучшения читабельности моего кода?
Спасибо за все ваши идеи и решения.
ОБНОВЛЕНИЕ, 27.10.11: См. Комментарии ниже.Артур Ульфельдт четко указал, что проблема связана с ссылками, и Дейв Рэй также правильно сказал, что все, что вам нужно сделать, это добавить this
в качестве параметра к enhanced-start-drag
, и тогда proxy-super
будет работать правильно.Когда я сделал следующие два изменения (без каких-либо изменений в теле из enhanced-start-drag
), мой код снова работал:
(defn enhanced-start-drag
""
[pie this]
и
(startDrag [pie] ; IN THE PROXY STMT IN custom-selection-event-handler
(enhanced-start-drag pie this))
Кстати, мой проект использует проект Дейва Рэя seesaw
, чтобы получить пользовательский интерфейс Java Swing.seesaw
потрясающе, как и строки документации и примеры кода (которые намного лучше, чем большинство коммерческих программ).Я очень рекомендую это!И спасибо, Дейв!