Clojure:我如何将代理方法代码从长代理语句中提取出来?
我有一个ClojureClojure:我如何将代理方法代码从长代理语句中提取出来?,clojure,proxy,refactoring,Clojure,Proxy,Refactoring,我有一个Clojureproxy语句变得越来越大和混乱,因此我决定尝试将beginDrag方法重新定义的代码从proxy语句中分解出来,如下所示: (defn enhanced-start-drag "" [pie] (let [pobj (. pie getPickedNode) pobj-coll (seq (.. pie getInputManager getKeyboardFocus getSelection))] (prin
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的主体拖放到proxy
语句主体中,一切都会正常工作
我的问题:是否有办法将混乱的细节转移到单独的函数中,以提高代码的可读性
感谢您的所有想法和解决方案
更新,2011年10月27日:见下面的评论。Arthur Ulfeldt尖锐地指出问题在于捕获的引用,Dave Ray也正确地指出,您所要做的就是将此
作为参数添加到增强的开始拖动
,然后代理超级
将正常工作。当我进行以下两项更改时(没有对增强的开始拖动的主体进行任何更改),我的代码再次工作:
(defn enhanced-start-drag
""
[pie this]
及
顺便说一句,我的项目使用Dave Ray的seesaw
项目来获得Java Swing UIseesaw
非常棒,它的文档字符串和示例代码(比大多数商业软件好得多)也非常棒。我强烈推荐它!谢谢你,戴夫 你被狗咬了。在这种情况下,这是有意的,尽管你需要保持警惕。从超级代理
Use to call a superclass method in the body of a proxy method.
Note, expansion captures 'this`
代理正在创建一个调用函数的类,当调用进入enhanced start drag
时,this
的值不是proxy super期望的值
您可能需要将此
作为另一个参数传递到增强的开始拖动中,然后调用(.已保存此…
),而不是使用超级代理
传递此
无效,因为调用.startDrag
将创建一个无限循环。另一种解决方案可能是将增强的开始拖动
放入宏中。将此
作为参数包含到增强的开始拖动
中,然后调用代理超级
将正常工作。没有无限循环。下面是一个例子:
Use to call a superclass method in the body of a proxy method.
Note, expansion captures 'this`