2017-07-08 5 views
2

用途は、これまでのベクトルである:Clojureにgetやmapやmapは別にありますか?私が知っている

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

とマップ上:ドキュメントから

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

それは言う:

clojure.core /取得する([地図キー] [マップキーが見つかりません])

キーが見つからない場合はnil、キーが存在しない場合はnilにマップされた値を返します。

答えて

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 

、マップ、ベクター、およびセットは、そのメンバーの機能として動作します完全:は、ボンネットの下に作品を取得する方法を理解するために

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

も参照してください@Thumbnail's answer

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

彼らと取得を使用する利点は、デフォルト値を提供できることです。

+0

お知らせ:彼らはやや意外にも、Clojureのgetは、Vector SなどのJavaコレクションでは動作しませんJavaのClass/isArray


によって検出されていますしかし、(({:a 1:b 2}:c 10) 'を使ってデフォルト値を指定してください。 –

3

@ToniVanhanla's answerさらに、JVMの場合、関連するClojureインターフェイスはclojure.lang.ILookupです。

見る、アメリカ人が言うように、フードの下、

  • Clojureのgetclojure.lang.RT/getへの呼び出しに変換されます。
  • 可能であれば、これはILookupにキャストされ、適切な valAtメソッドが呼び出されます。
  • 電話していない場合は、...RT/getFrom
  • ...その条項は、順番に、
    • のJavaマップ、
    • Clojureのセット、および
    • Java文字列と配列を明示的に扱います。

これらのフィットのいずれも場合、それはnilを返します。

Java配列の親インターフェイスはありません。それらはすべてObjectから直接発生します。マップのあなたができることを、

(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 
関連する問題