2016-07-16 3 views

答えて

10

関数定義で意味は何& barは、引数の残りすべてがリストに入れられるということです。リストのサイズに関しては何らの保証もしていないので、1つ以上の項目で空である可能性があります。それは意志、あなたがゼロアリティと、最初の関数定義を呼び出す場合は、この例では

(defn foo 
    ([] (foo 12)) 
    ([bar] (if (= bar 12) 1 2))) 

唯一のオプションの引数を持つへのより良いアプローチは、それがゼロまたは1つの引数を受け入れることです単にこれがうまくいく12

0

のデフォルト値を持つ第2の1アリティ関数の定義を呼び出す:

(defn foo [& bar] 
    (if (seq bar) 1 2)) 

seqを使用すると、方法です「空ではない」と書かれているはずです。 seq?とは全く別のものを意味しています。実際にはtrueが返されます。

重要なことは、barが機能体内のリストになることです。このリストを呼び出したときのものに戻したい場合は、applyを使用するか、以下のコメントで説明するように関数自体のリストを分解してください。

+5

共通のパターンは最初のものを破壊する '[&[bar]]'ですそれをオプションにします。 – ClojureMostly

+0

@ClojureMostlyしかし、これにより、追加の引数が黙って無視され、[this](https://github.com/magomimmo/modern-cljs/issues/373)のような微妙なバグが発生する可能性があります。 –

関連する問題