【问题标题】:Clojure, Aspects, Defprotocol, DefrecordClojure, 方面, Defprotocol, Defrecord
【发布时间】:2012-11-18 04:47:35
【问题描述】:
(defprotocol IAnimal "IAnimal"
  (report [o]
    (println (type o) " reporting.\n")
    (inner-report o)
    (println (type o) " out.\n")))

(defrecord Dog [] IAnimal
  (inner-report [o]
    (println "Woof Woof.\n")))

(defrecord Cat [] IAnimal
  (inner-report [o]
    (println "Meow Meow.\n")))

(defrecord Vampire [] IAnimal
  (inner-report [o]
    (println "I don't sparkle.\n")))

现在,我希望它输出:

Dog reporting.
Woof Woof.
Dog out.
Cat reporting.
Meow Meow.
Cat out.
Vampire reporting.
I don't sparkle.
Vampire out.

不幸的是,这不会发生,因为上面的代码无法编译。实现“这个”的最佳方式是什么?

这里所说的“this”是指我有一些想要成为协议一部分的功能,我想要对所有记录都有一个实现,并且我希望这个功能能够访问记录的专用功能实施。

(clojure 的做法是什么?)

【问题讨论】:

  • 使用protocols的任何具体原因,因为这可以像编写函数一样简单
  • 我正在 Clojure 中实现这个绘图库(以 SVG 显示)。对于我要绘制的每个元素(defrecord),都会弹出样板代码,我更愿意将其粘贴在某个地方(defprotocol 似乎是最小公倍数)

标签: clojure


【解决方案1】:

协议就像 Java 接口,它们不能为其方法提供实现。但这有效:

(defn report [o]
  (println (type o) " reporting.\n")
  (inner-report o)
  (println (type o) " out.\n"))

(defprotocol IAnimal
  "the animal protocol"
  (inner-report [o] "a report"))

(defrecord Dog []
  IAnimal
  (inner-report [o]
    (println "Woof Woof.\n")))

(defrecord Cat []
  IAnimal
  (inner-report [o]
    (println "Meow Meow.\n")))

(defrecord Vampire []
  IAnimal
  (inner-report [o]
    (println "I don't sparkle.\n")))

(report (new Cat))
;; user.Cat reporting.
;; Meow Meow.
;; user.Cat out.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多