Clojure: Как мне выделить код метода прокси из длинного оператора прокси? - PullRequest
4 голосов
/ 27 октября 2011

У меня есть оператор 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 потрясающе, как и строки документации и примеры кода (которые намного лучше, чем большинство коммерческих программ).Я очень рекомендую это!И спасибо, Дейв!

1 Ответ

4 голосов
/ 27 октября 2011

Вы были укушены захватом символа . В этом случае это интенционально, хотя вы должны знать об этом. Из документа на proxy-super

Use to call a superclass method in the body of a proxy method. 
Note, expansion captures 'this`

прокси создает класс, который вызывает функцию, когда вызов попадает в enhanced-start-drag значение this не там, где ожидает прокси-супер

вам может потребоваться передать this в качестве еще одного аргумента в улучшенное начальное перетаскивание, а затем вызвать (. saved-this ...) вместо использования proxy-super.


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...