2013-09-06 3 views
4

У меня есть 2 привязки. Я вызываю путь и обратный вызов.Возвращает первое непустое/пустое значение?

То, что я пытаюсь сделать, - это вернуть первый непустой. В javascript это будет выглядеть так:

var final = path || callback || ""; 

Как это сделать в clojure?

Я смотрел на «некоторые» функции, но я не могу понять, как объединить compjure.string/blank в нем. В настоящее время у меня это как тест, который не работает. В этом случае, я думаю, он должен вернуть нуль.

(some (clojure.string/blank?) ["1" "2" "3"]) 

В этом случае он должен вернуть 2

(some (clojure.string/blank?) ["" "2" "3"]) 

ответ

6
(first (filter (complement clojure.string/blank?) ["" "a" "b"])) 

Edit: Как было отмечено в комментариях, (filter (complement p) ...) можно переписать в виде (remove p ...):

(first (remove clojure.string/blank? ["" "a" "b"])) 
+2

Would' (сначала (удалить clojure.string/blank? ["" "A" "b"])) 'work ? – Blacksad

+0

@Blacksad хорошая точка - я всегда забываю о 'remove'. – Alex

+1

Другой способ записи: '(first (filter not-empty [" "" a "" b "]))'. – danneu

0

Это было трудно для меня, чтобы сказать именно то, что вы хотели, так это мое понимание того, что вы пытаетесь сделать.

В моем случае я хотел найти, если в одном отчете отсутствует элемент в одном отчете. Матч возвратил нуль, а несоответствие возвратило фактический элемент, который не совпал.

Следующие функции завершают сравнение значения отображаемого значения с ключом.

Использование чего-то вроде find-first, вероятно, то, что вы хотите сделать.

(defn find-first 
    "This is a helper function that uses filter, a comparision value, and 
    stops comparing once the first match is found. The actual match 
    is returned, and nil is returned if comparision value is not matched." 
    [pred col] 
    (first (filter pred col))) 

(defn str-cmp 
"Takes two strings and compares them. Returns 0 if a match; and nil if not." 
[str-1 str-2 cmp-start-pos substr-len] 

(let [computed-str-len (ret-lowest-str-len str-1 str-2 substr-len) 
    rc-1 (subs str-1 cmp-start-pos computed-str-len) 
    rc-2 (subs str-2 cmp-start-pos computed-str-len)] 

    (if (= 0 (compare rc-1 rc-2)) 
    0 
    nil))) 

(defn cmp-one-val 
"Return nil if first key match found, 
else the original comparision row is returned. 
cmp-row is a single sequence of data from a map. i 
cmp-key is the key to extract the comparision value. 
cmp-seq-vals contain a sequence derived from 
one key in a sequence of maps. 
cmp-start and substr-len are start and stop 
comparision indicies for str-cmp." 

[cmp-row cmp-key cmp-seq-vals cmp-start substr-len] 
(if (find-first #(str-cmp (cmp-key cmp-row) %1 cmp-start substr-len) cmp-seq-vals) 
    nil 
    cmp-row)) 
+0

Спасибо, но я понятия не имею, что вы совершающие здесь. В версии javascript у меня есть n + 1 переменные. Я хочу вернуть первый, который не является пустым, или вернуть пустую строку, если все пустое. – Geuis

+0

. Где определяется поиск? Я не вижу его в ядре. – Alex

+0

@Alex Спасибо, что уловили недостающую функцию. – octopusgrabbus

1

Это, как вы бы использовать some функцию:

(some #(when-not (empty? %) %) ["" "foo" ""]) 
"foo" 
(some #(when-not (empty? %) %) ["bar" "foo" ""]) 
"bar" 

Как уже отмечалось, filter другой вариант:

(first (filter #(not (empty? %)) ["" "" "foo"]) 
"foo" 

Третий вариант будет использовать рекурсию :

(defn first-non-empty [& x] 
    (let [[y & z] x] 
    (if (not (empty? y)) 
     y 
     (when z (recur z))))) 

(first-non-empty "" "bar" "") 
"bar" 
(first-non-empty "" "" "foo") 
"foo" 
(first-non-empty "" "" "") 
nil 

Я использовал empty? вместо blank? для сохранения при вводе текста, но единственная разница должна заключаться в том, как обрабатывается пробел.

+0

Вы можете сэкономить уровень скобок и использовать 'when-not';) – Alex

+0

@Alex good point – dbyrne

2

Если вы хотите, чтобы первая не пустая строка последовательности вы можете использовать что-то вроде этого:

(first (filter #(not (clojure.string/blank? %)) ["" "2" "3"])) 

Это вернет 2

Что я не понимаю, это ваш первый пример использования некоторых вы сказали, что он должен возвращать нуль, но первая непустая строка - «1».

0

Если вы так повезло, что «пустые значения», представленные ноль и/или ложным вы можете использовать:

(or nil false "a" "b") 

который вернет "a".

Эквивалент вашему примеру JavaScript будет:

(let [final (or path callback "")] 
    (println final)) 
Смежные вопросы