Использование forall() для извлечения строки из Option[String] в scala

Я не понимаю, когда forAll имеет дело со значениями None.

def areTheyEqual(x: Option[String], y: String) = {
    if (x.forall(_ == y)) {
        true
    } else {
        false
    }
}

Когда я вызываю функцию: areTheyEqual(None, "hello"), это возвращает true, когда я ожидаю, что это будет false, поскольку они не равны. Пожалуйста помоги. Почему это так?

Редактировать:

Чтобы решить эту проблему, я изменил оператор if на: if (x.nonEmpty && x.forall(_ == y)) Но я все еще хочу знать, почему он возвращает true без условия x.nonEmpty.


person Anime Lover    schedule 17.07.2020    source источник
comment
Если вы думаете о Some как о списке с одним элементом, а о None как о списке с 0 элементами (которыми они не являются), это может помочь.   -  person user    schedule 17.07.2020
comment
Кстати, if (foo) true else false избыточен, вы можете просто вернуть foo.   -  person Luis Miguel Mejía Suárez    schedule 17.07.2020
comment
Вот как forall выглядит как final def forall(p: A => Boolean): Boolean = isEmpty || p(this.get). Таким образом, если он пуст и это в любом случае означает None, он вернет true, в противном случае будет проверен предикат. Из документации `/** Возвращает true, если эта опция пуста '''или''' предикат` * $p returns true when applied to this $option's value. * * This is equivalent to: ` * option match {` ` * case Some(x) =› p(x)` * case None => true ` * }` */   -  person user2963757    schedule 17.07.2020


Ответы (1)


Вообще говоря, метод forall проверяет, удовлетворяют ли все объекты в коллекции некоторому предикату. Итак, что это значит, когда он возвращает false? Логически это должно означать, что в коллекции есть элемент, для которого предикат неверен. Так содержит ли None элемент, где предикат неверен? Очевидно, нет, потому что он вообще не содержит никакого элемента. Следовательно, для forall было бы неправильно возвращать false в этом случае. Так что все имеет смысл.

С другой стороны, метод exists вернет false, если Option пусто.

person Matthias Berndt    schedule 17.07.2020