论坛首页 编程语言技术论坛

Clojure reify

浏览 1429 次
锁定老帖子 主题:Clojure reify
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2016-09-22  

 

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]-->
 
  • 大小: 911.9 KB
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics