在Clojure中使用关键字作为地图键有什么好处?

在Clojure中使用关键字作为地图键有什么好处?,clojure,Clojure,我注意到,在Clojure中,在地图中使用关键字作为键是很常见的,而在其他没有这种概念的语言中,使用字符串是很常见的 使用关键字而不是字符串或其他类型有什么好处 关键字是一种符号类型,在语义上区别于字符串,具有较小的可表示值范围。而不是在JSON中使用等效的字符串键 关键字是内部的,因此关键字的所有实例都引用相同的对象。这对于平等性检查非常有用 关键字是函数,其作用类似于get,其本身作为关键参数。这对于“我想要所有这些人的电话号码”(map:phone no people)和(map#(get

我注意到,在Clojure中,在地图中使用关键字作为键是很常见的,而在其他没有这种概念的语言中,使用字符串是很常见的

使用关键字而不是字符串或其他类型有什么好处

  • 关键字是一种符号类型,在语义上区别于字符串,具有较小的可表示值范围。而不是在JSON中使用等效的字符串键
  • 关键字是内部的,因此关键字的所有实例都引用相同的对象。这对于平等性检查非常有用
  • 关键字是函数,其作用类似于
    get
    ,其本身作为关键参数。这对于“我想要所有这些人的电话号码”
    (map:phone no people)
    (map#(get%”“phone no”)这样的情况非常方便。
  • 关键字还可以方便地使用
    let
    和其他解构工具:

    (let[{:keys [foo bar]} {:foo 1 :bar 30}]
      (+ foo bar)) ;;=>31
    

    但这实际上也适用于使用不太常见的
    :strs
    解构的字符串键

    而且,作为键,关键字的速度比字符串快。您不需要计算散列并执行比较,就像您(我认为)对字符串所做的那样,代价是无限的。这是从(2)中得出的结论。clojure 1.7不再适用,请参阅它已被删除,以使符号创建更具性能。