是否可以转换以下代码,以便使用<a href="whatsapp://send" data-text="Take a look at this awesome website:" data-href=" ( your url )">Share</a>
和defprotocol
代替defrecord
和defmulti
?
defmethod
答案 0 :(得分:5)
是的,您在协议定义Shape
中声明了您的函数,然后在各种记录实现Square
,Circle
等中定义您的实现。
(defprotocol Shape
(area [this])
(perimeter [this]))
(defrecord Square [side] Shape
(area [this] (* (:side this) (:side this)))
(perimeter [this] (* 4 (:side this))))
(defrecord Rect [w l] Shape
(area [this] (* (:l this) (:w this)))
(perimeter [this] (+ (:l this) (:l this) (:w this) (:w this))))
(def s (->Square 4))
(def r (->Rect 2 5))
(map area [s r]) ; '(16 10)
(map :side [s r]) ; '(4 nil)
(map :l [s r]) ; '(nil 5)
如果你熟悉的话,基本上这就像OOP(但是不可改变的)。
对于像这样的事情的defmulti实现的一个好处是,你可以经常只是序列化和反序列化你的地图并按原样使用它们,而不必将它们统一到特定的记录类中。