(reify & opts+specs)
reify是一个宏,结构如下:
(reify options* specs*)
目前没有说明options,不需要指定。每个specs由协议或接口名及后跟的0个或多个方法体组成:
protocol-or-interface-or-Object
(methodName [args+] body)*
如果是协议或接口,需要提供所有的方法实现。如果是对象,还可以覆盖对象中的方法。需要说明的是,方法的第一个参数必须指定相应的目标对象,在Java语言中,就是“this”。
例子:
user=> (str (let [f "foo"]
#_=> (reify Object
#_=> (toString [this] f))))
"foo"
user=> (seq (let [f "foo"]
#_=> (reify clojure.lang.Seqable
#_=> (seq [this] (seq f)))))
(\f \o \o)
再来一个例子:
user=> (def server (reify
#_=> Server
#_=> (server-init [this]
#_=> (str "server init"))
#_=> (server-start [this]
#_=> (str "server start"))))
#'user/server
user=> (.server-init server)
"server init"
user=> (.server-start server)
"server start"
再来一个例子:
user=> (def def-fp (reify
#_=> Server
#_=> (server-init [this]
#_=> (str "server init"))
#_=> (server-start [this]
#_=> (str "server start"))
#_=> Client
#_=> (client-init [this]
#_=> (str "client init"))
#_=> (client-start [this]
#_=> (str "client start"))))
#'user/def-fp
user=> (class def-fp)
user$reify__1440
user=> (.server-init def-fp)
"server init"
user=> (.server-start def-fp)
"server start"
user=> (.client-init def-fp)
"client init"
user=> (.client-start def-fp)
"client start"
一个实际的例子:
<!--[if ppt]-->•<!--[endif]-->
<!--[if ppt]-->•<!--[endif]-->