Почему следующие тесты возвращают false в Scala? - PullRequest
0 голосов
/ 06 октября 2011

Оба следующих отпечатка ложны.Желаемое поведение: первый печатает true, а второй - false.Я не уверен, почему ложь всегда печатается.

def myTest(filter: => Boolean) = () => {

  if (filter) {
    // do something here
    true
  }
  false
}

println(myTest(5 > 3)())
println(myTest(5 > 7)())

Ответы [ 3 ]

14 голосов
/ 06 октября 2011

Это выражение:

if (filter) {
  true
}

- это выражение, которое возвращает true, когда filter оценивается как true или Unit () в противном случае.

Этот блок:

{
  expr;
  false
}

- это блок, который оценивает expr, отбрасывает его, затем возвращает false.

Итак:

{
  if (filter) {
    true
  }
  false
}

всегда возвращает false.Думайте о if (filter) { true } как expr;

5 голосов
/ 06 октября 2011

huynhjl дает синтаксическую причину.Феноменологическая причина в том, что вы забыли else до false.

scala> def myTest(filter: => Boolean) = () => {
     |
     |   if (filter) {
     |     // do something here
     |     true
     |   }
     |   else false
     | }
myTest: (filter: => Boolean)() => Boolean

scala> println(myTest(5 > 3)())
true

scala> println(myTest(5 > 7)())
false
2 голосов
/ 06 октября 2011

Последний оператор является ложным, поэтому он возвращает ложь, и вам понадобится оператор else в выражении if для условного выполнения этого оператора.

Так же, как указать на то, что ваш параметр фильтра уже разрешает логическое значение, поэтому, если выражение полностью избыточно, ваша конструкция может быть переписана просто как:

def myTest(filter: => Boolean) = () => filter

, что может привести к дальнейшим экзистенциальным вопросам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...