最初の唯一のパラメータとしてオプションのパラメータを持つ関数を使用できますか?最初のパラメータをオプションとして持つことはできません
ので
(defn foo [& bar] (if (= bar) 1 2))
最初の唯一のパラメータとしてオプションのパラメータを持つ関数を使用できますか?最初のパラメータをオプションとして持つことはできません
ので
(defn foo [& bar] (if (= bar) 1 2))
関数定義で意味は何& bar
は、引数の残りすべてがリストに入れられるということです。リストのサイズに関しては何らの保証もしていないので、1つ以上の項目で空である可能性があります。それは意志、あなたがゼロアリティと、最初の関数定義を呼び出す場合は、この例では
(defn foo
([] (foo 12))
([bar] (if (= bar 12) 1 2)))
:
唯一のオプションの引数を持つへのより良いアプローチは、それがゼロまたは1つの引数を受け入れることです単にこれがうまくいく12
のデフォルト値を持つ第2の1アリティ関数の定義を呼び出す:
(defn foo [& bar]
(if (seq bar) 1 2))
seq
を使用すると、方法です「空ではない」と書かれているはずです。 seq?
とは全く別のものを意味しています。実際にはtrue
が返されます。
重要なことは、bar
が機能体内のリストになることです。このリストを呼び出したときのものに戻したい場合は、apply
を使用するか、以下のコメントで説明するように関数自体のリストを分解してください。
共通のパターンは最初のものを破壊する '[&[bar]]'ですそれをオプションにします。 – ClojureMostly
@ClojureMostlyしかし、これにより、追加の引数が黙って無視され、[this](https://github.com/magomimmo/modern-cljs/issues/373)のような微妙なバグが発生する可能性があります。 –
'(= x)' in 'x'が例外を投げてフォームの実行を中断しない限り、クロージャは常に' true'です。 – noisesmith