1

これが本当に基本的な質問である場合は申し訳ありませんが、私が見たいくつかのコードは私に興味をそそられました。

apply関数の慣用的な使用法は何ですか?

たとえば、次の形式で記述されたコードを見たことがあります。

(distinct [1 2 3 4 5 6])

(apply distinct? [1 2 3 4 5 6])

これらは同じ結果を返し、ドキュメントでも、次のように明確に示されています。

;; 次の2つの形式の同等性に注意してください

user =>(apply str ["str1" "str2" "str3"]) "str1str2str3"

user =>(str "str1" "str2" "str3") "str1str2str3"

この例は、の有用性を伝えるには単純に基本的すぎapplyますか?それとも、2つの根本的な違いが欠けていますか?

ある形式が他の形式よりも優れていると見なされるのはいつですか。

4

4 に答える 4

5
user=> (apply str ["str1" "str2" "str3"]) "str1str2str3"

user=> (str "str1" "str2" "str3") "str1str2str3"

この例で使用する利点はapply、文字列のリストを取得できることです。str、それ自体ではできません。

私は専門家ではありませんが、本能的に、必要でないapply限り使用すべきではないと言っています。したがって、可変引数関数に渡したい値のコレクションがある場合は、applyが便利です。それ以外の場合は、単純な関数を使用してstrください。

于 2013-03-20T15:05:06.377 に答える
4

これらは両方とも真実ですが、非常に異なる理由があります。

(distinct? [1 2 3 4 5 6])
;=> true

引数は 1..6 のベクトル 1 つだけであり、他の引数がないため、他の引数とは区別され ます。

(apply distinct? [1 2 3 4 5 6])
;=> true

6 つの引数があり、そのすべてが異なります。

観察:

(distinct? [1 1 1])
;=> true

引数は 1 つだけで、3 つ1の s のベクトルです。

(apply distinct? [1 1 1])
;=> false

3 つの引数があり、その 3 つすべてが1です。

違いに注意してください。

(str [1 2 3])
;=> "[1 2 3]" -- single argument of a vector stringified

(apply str [1 2 3])
;=> "123" -- three arguments each stringified and concatenated

Apply は変換に影響を与えますが(apply f [a b c]) => (f a b c)、これは一般に と同じではありません(f [a b c])

于 2013-03-20T15:19:18.750 に答える
2

applyコレクションを関数の引数として扱いたい場合に使用します。の場合はdistinct引数としてコレクションを取るので、 を使う必要はありませんapply

(distinct [1 2 3 4 1 1])
;returns: (1 2 3 4)

distinct?引数が異なる場合は true を返します。

(distinct? [1 2 3 4 1 1])
;returns true because there's only one argument

applyコレクション内のアイテムを引数として使用します。

(apply distinct? [1 2 3 4 1 1])
;returns false because of the duplicated 1's
于 2013-03-20T15:27:47.947 に答える
1

通常、apply関数を呼び出すときにベクトルを引数に変換するために使用します。これは、ここapplyに示す JavaScript の関数によく似ています。

などの関数strは可変引数であり、入力と同じ型 (この場合は を実装するもの) を期待しますtoString。使用(str a b c)は慣用句で(apply str [a b c])はありません。

この関数applyは、関数の引数として使用したい項目を持つ異種ベクトルがある場合に使用できます。ベクトル内の項目が関数の引数に対応するベクトルのリストを作成する必要がある場合は、 を使用する必要がありますapply

私は次のように考えていますapply: ベクトルを引数に分解します。

例:

(def authtypes [:basic :basic :oauth])
(def usernames ["charlie" "snoopy" "lisa"])
(def passwords ["brown" "dog" "maggie"])

(let [credentials (map vector authtypes usernames passwords)]
  (doseq [c credentials]
    (apply login-user c)))
于 2013-03-20T15:27:42.117 に答える