覆盖在 cljs.core 中定义的符号工作得很好,并打印出一个预期的警告。这种情况失败的一个例子是当被替换的符号最初是一个宏并且没有被命名空间限定的情况下调用。例如:
`
}
;;;;;;; 文件 a ;;;;;;
(ns file.a)
(defn + [& vals]
(prn "被调用!")
(apply cljs.core/+ vals))
;;;;;;; 文件 b ;;;;;;
(ns file.b
(:require [file.a :refer [+]]))
(+ 1 2) ;; 不打印 "被调用!"
(file.a/+ 1 2) ;; 打印 "被调用!"
(var +) => file.a/+
(+ 1 2) ;; 打印 "被调用!"
``
}
在文件 b 中,单独的符号 +
调用了 cljs.core/+ 而不是预期的 file.a/+,尽管它被引用了并且所有的变量解析都解析到了 file.a/+.这并不适用于覆盖 cljs.core 中的函数,例如覆盖函数 map
就没问题。
`
;;;;;;; 文件 a ;;;;;;
(ns file.a)
(defn map [f coll]
(prn "map 被调用!")
(cljs.core/map f coll))
;;;;;;; 文件 b ;;;;;;
(ns file.b
(:require [file.a :refer [map]]))
(map inc [1 2 3]) => "map 被调用!" (2 3 4)
`
}