2016-12-16 4 views
1

これは私が期待する道をコンソールに書き込みますClojurescriptでは、コレクションの要素を変数arity Javascript関数の引数として渡すにはどうすればよいですか?

(defn log-it [& args] (.log js/console args)) 
(log-it "hello" "there") 

(.log js/console "hi" "there") 

出力は

hi there 

これは、しかし、ちょうどコンソールに大きな混乱を書き込んで出力は:

c…s.c…e.IndexedSeq {arr: Array[2], i: 0, meta: null, cljs$lang$protocol_mask$partition0$: 166592766, cljs$lang$protocol_mask$partition1$: 8192} 

また、これは動作しません:

(apply .log js/console ["hi" "there"]) 

は.logの機能へのベクターの要素を渡す方法はありますか? ベクトルを連結して'(.log js/console)にマクロを書き込む必要がありますか?

+0

clojurescriptのバージョン私はプランク1.17をclojurescript 1.9で実行しています。あなたの 'log-it'関数はうまくいくようです。 –

答えて

2

問題は、個々の引数としてseqの値を渡すのではなく、args(これはClojure IndexedSeq)の値を記録しようとしていることです。この場合、applyを使用する必要があります(またはそのシーケンスをネイティブデータ構造に変換する必要があります)。

the signature for applyを見ると、他の例がうまくいかない理由が明確になるはずです。

(apply f args) 

これは、最初の引数は呼び出したい関数であることを期待が、ここでは、最初の引数は.logです。

(apply .log js/console ["hi" "there"]) 

.log js/consoleconsolelogメソッドを呼び出すための構文であることを覚えておいてください。代わりに、console.log関数への参照を取得したいと考えています。

(apply (.-log js/console) args) 

我々は.log財産を読んではなく、方法としてそれを呼び出すために.-logを使用しています。それから我々はargsシーケンスと一緒にそれを渡します。

ので、代わりに、あなたは、元の関数を定義することができます

(defn log-it 
    [& args] 
    (apply (.-log js/console) args)) 

それとも、少し賢く取得したい場合。

(def log-it (partial (.-log js/console))) 
+0

素晴らしい答え。最後のコードスニペットには1つの閉じ括弧がありません – kevincasey

関連する問題