2014-12-10 8 views
1

Класс Option имеет хороший метод foreach, который вызывает переданный код, если задано значение. Есть ли какой-либо подобный метод для значения None? Я знаю о .orElse метод, но, используя его, я должен вернуться Option из блока кода:Scala: выполнить анонимный кодовый блок для значения None в опции

x orElse { 
    // do something 
    None // <-- I want to avoid this line 
} 
+0

один вариант по определению предназначен, чтобы заставить вас управлять None случай, так что вы не должны быть в состоянии избежать None – sam

+0

@ Сэм, но мой вопрос об обращении 'None'. –

ответ

4

Если вы хотите сделать что-то в None случае я предполагаю, что вы в нем побочные. Итак, что случилось с:

if(o.isEmpty){ 
    // do things 
} 
+0

Я хочу что-то сделать, когда результата нет. Например, я хочу сделать запрос api, только если результаты базы данных отсутствуют. Почему это побочное действие? –

+0

Это побочный эффект, потому что вы не возвращаете значение, так как вас интересует только один случай («Нет»). Не беспокойтесь об этом. Дело в том, что в библиотеке нет «noneForeach», поэтому вам лучше использовать 'if (o.isEmpty)'. – vptheron

2

Я не думаю, что она существует в стандартной библиотеке Option, но вы можете добавить его с неявным классом

class OptionFunctions[T](val opt: Option[T]) extends AnyVal { 
    def ifEmpty[A](f: => A): Unit = { 
    if (opt.isEmpty) f 
    } 
} 

и использовать его как это:

val o = Some(1) 
o.ifEmpty { println("empty") } 
+0

Да, это сработает. Но мой вопрос больше связан с _proper_ способом сделать это. Например, я могу просто проверить 'isEmpty' с оператором' if'. –

+1

нет * правильный * способ, выбор дизайна полностью до вас –

1

Возможно, образец матча?

option match { 
    case Some(foo) => println("Have " + foo) 
    case None => println("Have nothing.") 
} 
+0

Это упрощенное решение, но я хочу написать более функциональный код. –

+0

Не уверен, что вы подразумеваете под «кодом функционального стиля» точно, но сопоставление шаблонов довольно идиоматическое scala ... – Dima

+0

Я часто задаю себе тот же вопрос, что и OP, только чтобы понять, что я действительно обрабатываю оба случая, не нуждаясь в результатах (например, 'x.map (...). orElse (...)'. В этом случае сравнение шаблонов является лучшим способом. –

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