我列出了支持和反对这两种形式的论据。 (编辑:添加了第三个选项 - (get map :key),尽管有点冗长,但这是我的新宠)
(:key map) 的参数
1) 编码标准中要求
http://dev.clojure.org/display/community/Library+Coding+Standards
2) 当 map 为 nil 时仍然有效
> (:a nil)
nil
> (nil :a)
ERROR: can't call nil
---counterargument---如果key可能为nil,其他形式更好
> ({:a "b"} nil)
nil
> (nil {:a "b"})
ERROR: can't call nil
3) 更适合对象集合的线程化和映射
(-> my-map
:alpha
fn-on-alpha
:beta
fn-on-beta
:gamma
> (def map-collection '({:key "values"} {:key "in"} {:key "collection"}))
> (map :key map-collection)
("values" "in" "collection")
---counterargument---线程的代码结构不同于
通常,因此可以将不同的惯用倾向应用于地图访问
需要时
4) 潜在的优化收益? (需要验证)
(map :key) 的参数
1) key 为非关键字或 nil 时不报错
> ({:a "b"} nil)
nil
> (nil {:a "b"})
ERROR: can't call nil
> ({"a" "b"} "a")
"b"
> ("a" {"a" "b"})
ERROR: string cannot be cast to IFn
2) 与 Clojure 中的列表访问保持一致
> ([:a :b :c] 1)
:b
> (1 [:a :b :c])
ERROR: long cannot be cast to IFn
3) 与其他形式的对象访问的相似性
java> my_obj .alpha .beta .gamma .delta
clj > ((((my-map :alpha) :beta) :gamma) :delta)
clj > (get-in my-map [:alpha :beta :gamma :delta])
cljs> (aget js-obj "alpha" "beta" "gamma" "delta")
4) 访问同一地图中的多个键时的对齐方式(单独的行)
> (my-func
(my-map :un)
(my-map :deux)
(my-map :trois)
(my-map :quatre)
(my-map :cinq))
> (my-func
(:un my-map)
(:deux my-map)
(:trois my-map)
(:quatre my-map)
(:cinq my-map))
---counterargument---从多个map访问同一个key时对齐更差
> (my-func
(:key map-un)
(:key map-deux)
(:key map-trois)
(:key map-quatre)
(:key map-cinq)
> (my-func
(map-un :key)
(map-deux :key)
(map-trois :key)
(map-quatre :key)
(map-cinq :key)
(get map :key) 的参数
1) 如果 arg1 是 map/vector/nil 并且 arg2 是 key/index/nil,则永远不会导致错误
> (get nil :a)
nil
> (get nil nil)
nil
> (get {:a "b"} nil)
nil
> (get {:a "b"} :q)
nil
> (get [:a :b :c] nil)
nil
> (get [:a :b :c] 5)
nil
2) 与其他 Clojure 函数的形式一致
> (get {:a "b"} :a)
:b
> (contains? {:a "b"} :a)
true
> (nth [:a :b :c] 1)
:b
> (conj [:a :b] :c)
[:a :b :c]
3) 地图优先的对齐优势
> (my-func
(get my-map :un)
(get my-map :deux)
(get my-map :trois)
(get my-map :quatre)
(get my-map :cinq))
4) Get-in 可用于一次调用的嵌套访问
> (get-in my-map [:alpha :beta :gamma :delta])
> (aget js-obj "alpha" "beta" "gamma" "delta")
来源:在http://tryclj.com/上测试