エンコードするために、特定のオブジェクトのクラスをオンにしたいと考えています。
(defn encoded-msg-for [msg]
(case (class msg)
java.lang.Double (encode-double msg)
java.lang.String (encode-str msg)
java.lang.Long (encode-int msg)
java.lang.Boolean (encode-bool msg)
clojure.lang.PersistentArrayMap (encode-hash msg)
clojure.lang.PersistentVector (encode-vec msg)
nil "~"
)
)
を呼び出すと(encoded-msg-for {})
、返されますNo matching clause: class clojure.lang.PersistentArrayMap
奇妙なのは、ケースをハッシュ マップ (クラスをキーとして、文字列を値として) に配置すると、完全にうまく機能することです。
また、(= (class {}) clojure.lang.PersistentArrayMap)
真です。ここでどのような比較が行われているのでしょうか。また、オブジェクト自体のクラスまたは (より良い) 階層内の何かを切り替えるにはどうすればよいでしょうか?