Clojure reify

reify
(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]-->
 

猜你喜欢

转载自lobin.iteye.com/blog/2326244