gpt4 book ai didi

Clojure、方面、Defprotocol、Defrecord

转载 作者:行者123 更新时间:2023-12-02 10:16:04 27 4
gpt4 key购买 nike

(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.

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

这里的“这个”,我的意思是我有一些函数想要成为协议(protocol)的一部分,我想要为所有记录有一个它的实现,并且我希望这个函数能够访问记录的专门函数实现。

(clojure 的方法是什么?)

最佳答案

协议(protocol)就像 Java 接口(interface),它们不能提供其方法的实现。但这是有效的:

(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.

关于Clojure、方面、Defprotocol、Defrecord,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13437586/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com