2017-07-08 30 views
2

的使用,我知道到目前为止都在向量:除了地图和向量,Clojure还有其他用途吗?

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

,并在地图上:

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

从技术文档,它说:

clojure.core /获取([图键] [地图键未找到])

如果键不存在,则返回映射到键的值,未找到或无。

回答

9

除了地图和载体,共同使用了得到是字符串:

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

得到也适用于集和本地Java(脚本)阵列。在ClojureScript和JavaScript间-OP一个可能的用途:

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

再举一个例子,让作品在一组查找的资料:

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

注意,它不以工作(整理)设置和索引,例如:

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

此外,地图,矢量和集作为其成员的功能,让你可以经常避免使用得到干脆:

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

使用的优势得到他们是可以提供一个默认值:

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

又见@Thumbnail's answer了解如何让引擎盖下作品。

+0

注意,对于地图,你可以使用'(({:a 1:b 2}:c 10)'指定默认值,但它不适用于矢量 –

3

除了@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集合的工作,如Vector小号检测:

(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 
相关问题