Clojureプロキシは常にsuper.method()を呼び出しますか?
-
17-09-2020 - |
質問
clojureプロキシ、
Proxyに渡されたfns
は既存のメソッドを上書きしたり、super.method()
と組み合わせて呼び出されますか?
次のコードでは、RequestHandler.get()がプロキシget []
と共に呼び出されます。
;see: http://github.com/paulosuzart/JTornado
(ns org.ctornadoweb)
(import '(org.jtornadoweb Web$RequestHandler))
(import '(org.jtornadoweb HttpServer Web$Application))
(let [myHandler (proxy [Web$RequestHandler] []
(get []
(.write "Hi CLJ"))
(post []
(.write "POST")))]
(.listen
(HttpServer.
(.add (Web$Application.) "/" (class myHandler))
false nil false) 8089))
.
コンパイル済み/継承バージョン:
; Starts a JTornado HTTP Server and a sample RequestHandler.
; Bit verbose due to compilation directives. Recommendation is to generate
; a set of macros to hide this.
(ns org.ctornadoweb
; Compiled and implements a static main method to start the server
(:import (org.jtornadoweb HttpServer)
(org.jtornadoweb.Web$Application)
(org.jtornadoweb.Web$RequestHandler))
(:gen-class :prefix "server-"))
(gen-class
:name org.ctornadoweb.MyHandler
:extends org.jtornadoweb.Web$RequestHandler
:prefix "do")
(defn do-get [this]
"Handles the HTTP GET method"
(.write "hello clojure"))
(defn do-post [this]
"Handles the HTTP POST method"
(.write (.getArgument "name" "default" false)))
(defn server-main []
"main method"
(.listen
(org.jtornadoweb.HttpServer.
(.add (org.jtornadoweb.Web$Application.) "/" org.ctornadoweb.MyHandler)
false nil false) 8089))
;use (compile 'org.ctornadoweb)
.
トレースには、プロキシが呼び出されてからSUPER.GET、SUPER.GET、(デフォルトで)例外が表示されます。
HTTP 405: Method Not Allowed
at org.jtornadoweb.Web$RequestHandler.get(Web.java:72)
at org.ctornadoweb.proxy$org.jtornadoweb.Web$RequestHandler$0.get(Unknown Source)
.
Clojureプロキシの実際の動作についての言葉を見つけようとしました。誰かがこの助けを与えることができますか?
解決
いいえ、Superメソッドは自動的に呼び出されませんが、proxy-super
で明示的に呼び出すことができます。
次のテストケースは、それらが必要なものとして機能することを示しています。
user=> (def foo
(proxy [java.util.ArrayList] []
(clear [] (println "not clearing"))))
#'user/foo
user=> (.size foo)
0
user=> (.add foo "hi")
true
user=> (.add foo "bye")
true
user=> (.size foo)
2
user=> (.clear foo)
not clearing
nil
user=> (.size foo)
2
.
super.clear()
が呼び出された場合、サイズは0として表示されます。
所属していません StackOverflow