【问题标题】:Apart from maps and vectors are there any other uses of get in Clojure?除了地图和向量之外,Clojure 中的 get 还有其他用途吗?
【发布时间】:2017-07-08 04:01:43
【问题描述】:

目前我知道的用途是向量:

(get [1 2 3 4] 2) ; => 3

在地图上:

(get {:a "a" :b "B" :c "c"} :c) ; => "c"

从文档中说:

clojure.core/get ([map key] [map key not-found])

返回映射到键的值,如果键不存在,则返回 not-found 或 nil。

【问题讨论】:

    标签: dictionary vector clojure get


    【解决方案1】:

    除了地图和矢量,get 的一个常见用途是在字符串上:

    (get "Cthulhu" 2) ;; => \h
    

    get 也适用于集合和原生 Java(Script) 数组。 ClojureScript 和 JavaScript 互操作中的一种可能用法:

    (def js-array (-> (js/Array 10) ;Create and fill native JS array
                      (.fill "a")
                      (.map (fn [_ i] i))))
    (get js-array 3) ; => 3
    

    再举一个例子,get 用于在集合中按项目查找的作品:

    (get #{:b :c :a} :c) ;;=> :c
    

    请注意,它不适用于(排序的)集合和索引,例如:

    (get (sorted-set :b :a :c) 1) ;; throws exception
    

    此外,地图、向量和集合充当其成员的函数,因此您通常可以完全避免使用 get

    (#{:a :b :c} :b) ; => :b
    ({:a 1 :b 2 :c 3} :b) ; => 2
    ([:a :b :c] 1) ; => :b
    

    与它们一起使用get的好处是你可以提供一个默认值:

    (get {:a :b :c} :d) ; => nil
    (get {:a :b :c} :d :not-found) ; => :not-found
    

    另请参阅@Thumbnail's answer 以了解 get 如何在后台工作。

    【讨论】:

    • 注意,对于地图,您可以使用(({:a 1 :b 2} :c 10) 指定默认值。但是,它不适用于向量
    【解决方案2】:

    进一步@ToniVanhanla's answer,对于JVM,相关的Clojure接口是clojure.lang.ILookup

    正如美国人所说,在引擎盖下寻找,

    • Clojure get 转换为对 clojure.lang.RT/get 的调用。
    • 如果可能,这将转换为 ILookup 并调用适当的 valAt 方法。
    • 如果没有,它会调用...RT/getFrom
    • ... 其子句依次明确处理
      • Java 地图,
      • Clojure 集和
      • Java 字符串和数组。

    如果这些都不适合,则返回nil

    Java 数组没有父接口:它们都直接来自Object。它们被 Java 的Class/isArray检测到


    有点令人惊讶的是,Clojure get 不适用于 Java 集合,例如 Vectors:

    (java.util.Vector. (seq "Hello, world!"))
    => [\H \e \l \l \o \, \space \w \o \r \l \d \!]
    

    但是

    (get (java.util.Vector. (seq "Hello, world!")) 4)
    => nil
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-14
      • 2010-10-25
      • 2014-04-25
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 2023-02-09
      相关资源
      最近更新 更多