clojurescript:麻烦扩展IAssociative assoc方法

时间:2013-12-10 09:06:23

标签: clojurescript

好的,我这里有两个版本的功能。一个有效,一个没有。代码基于多米纳源;我正在将相同的概念扩展到谷歌地图。 工作一:

(defn- create-listener-function
[f type]
(fn [evt]
  (f (reify
      ILookup
      (-lookup [o k]
         (if-let [val (aget evt k)]
           val
           (aget evt (name k))))
      (-lookup [o k not-found] (or (-lookup o k)
                                not-found))
      IAssociative
      (-assoc  [o k v]
         (aset o (name k) v))))
true))

好的,所以上面的工作正常,我可以像这样查找返回对象的成员:

 (:latLng obj)

但是,当我尝试使用下面的代码将某些内容与返回的对象关联时,我无法再检索对象的属性。

  [f type]
  (fn [evt]
  (f (assoc (reify
             ILookup
             (-lookup [o k]
               (if-let [val (aget evt k)]
                 val
                 (aget evt (name k))))
             (-lookup [o k not-found] (or (-lookup o k)
                                         not-found))
             IAssociative
             (-assoc  [o k v]
               (aset o (name k) v)))
       :type type))
 true))

我错过了什么?

1 个答案:

答案 0 :(得分:0)

我认为您可能只需要通过其完全限定名称IAssociative来引用cljs.core.IAssociative协议。在任何情况下,如果我使用限定名称但不使用较短的名称,则下面的简化示例适用于我。

然而,我发现ILookup也有同样的事情,(我需要使用cljs.core.ILookup),所以如果没有全名这对你有用,那么我或许就是我或你的设置有些不同。

cljs.user> (let [a (array 0 1 2 3)]
             (def obj
               (reify
                 cljs.core.IAssociative
                 (-assoc [_ k v]
                   (aset a k v)
                   (vec a)))))
nil
cljs.user> (assoc obj 0 'zero)
[zero 1 2 3]
cljs.user> (assoc obj 1 'one)
[zero one 2 3]