第三個參數在extend-protocol
上有什麼用處?假設我有擴展協議第二個參數有什麼用處
(defprotocol my-protocol
(foo [x]))
(extend-protocol my-protocol
java.lang.String ; this
(foo [x] (.length x)))
(foo "fooooo") ; 6
轉化到:
(defprotocol my-protocol
(foo [x]))
(extend-protocol my-protocol
java.lang.Long ; this
(foo [x] (.length x)))
(foo "fooooo") ; it gave an output 6, while I expect it will throws, since I'm extending from Long, where it doesn't have length()
; In the end, it will just check on the args ? (in this case it's x)
在那裏,我把它java.lang.String
,如果我將其更改爲java.lang.Long
,呼籲foo
沒有拋出任何異常,而Long
沒有length()
上它。它引發的唯一情況是當參數foo
沒有length()
時。
正如我在回答中所提到的,如果將協議擴展爲'String'和*然後*到'Long',則實現到'String'不會消失。所以這就是爲什麼'foo'仍然在字符串上工作。但是現在你也有一個'Long'的實現是沒有意義的,所以如果你長時間調用'foo',而不是告訴你沒有匹配的實現,Clojure會嘗試使用你提供的那個,在做這件事時遇到問題。 –