2016-02-18 2 views
1

Есть ли встроенный способ передать только n-й аргумент другой функции. считают это:pass only nth аргумент

(defn nth-arg [i & args] 
    (nth args i)) 

и для удобства:

(def arg1 (partial nth-arg 0)) 
(def arg2 (partial nth-arg 1)) 
(def arg3 (partial nth-arg 2)) 

Это сделало бы возможным избежать конструкции типа (Fn [_ _ х] (Foo х)):

(comp foo arg3) 
+2

Не могли бы вы привести пример фактической функции, в которой это было бы полезно? –

+0

На самом деле я столкнулся с этим через код в сообщении, на который вы только что ответили: http://stackoverflow.com/questions/35470950/getting-the-positions-of-the-occurrences-of-one-item-in- a-sequence/35471392? noredirect = 1 # comment58638472_35471392 –

+2

В анонимной функции, которую вы передаете 'filter', вы фактически разрушаете вектор, * не * принимаете второй аргумент. Вы можете переписать его как '(comp (partial = item) second)'. –

ответ

1

Нет Это хороший стиль, чтобы принимать только аргументы, которые будут использоваться в ваших функциях. В тех случаях, когда вы можете думать, что удобно принимать больше, рассмотрите возможность преобразования входных данных. Сохранение различия между приложением функции и выбором данных - это хорошо.

Иногда вам приходится создавать функции, которые не используют первый аргумент, например, при определении протоколов, часто вам не нужен аргумент this, поэтому вы просто отбрасываете его. Здесь снова лучше быть явным и прямым о том, что происходит. Вы не сделаете код более элегантным, делегируя другой функции, просто еще один умственный шаг для читателя.

Избегайте вардического поведения, когда оно вам не подходит. Вы жертвуете реальной выгодой (проверка арности). Он раскрывает вас до трудностей, чтобы рассуждать об ошибках (opps я должен был применить этот вектор вместо его передачи!) У меня было 4 параметра вместо 3 после того, как я реорганизовал, чтобы не понадобился второй аргумент).

Смежные вопросы