Почему обеспечение работает только на else?

#scala #assertions

#scala #утверждения

Вопрос:

В scala, когда я использую предустановку обеспечения, она работает только с else частью выражения if-else:

 def evenIt(x:Int) = {
    if(x % 2 == 0)
            x 1 //return odd on purpose!
    else{
      x   1
    } ensuring( _ % 2 == 0)
}

//Test it:
evenIt(3)
> 4
evenIt(4)
> 5  //<--- ensuring does not catch this!
  

Но я думал, что «if-else» — это выражение в scala. Таким образом, оно должно просто возвращать значение, которое, в свою очередь, должно быть передано в обеспечение?

Или я здесь что-то путаю? Спасибо.

РЕДАКТИРОВАТЬ: В книге «Программирование на Scala» автор использует его следующим образом:

 private def widen(x: Int) : Element =
   if(w <= width)
      this
   else {
      val left = elem(' ', (w - width) / 2, height)
      var right = elem(' ', w - width - left.width, height)
      left beside this beside right
   } ensuring ( w <= _.width
  

Применяет ли он это только к else части здесь?

Ответ №1:

Да, if-else — это выражение, но то, как вы заключили его в квадратные скобки, применяется только ensuring к x 1 , а не к if -выражению. Если вы поставите ensuring после закрывающей фигурной скобки, окружающей if , это будет делать то, что вы хотите:

 def evenIt(x:Int) = {
    if(x % 2 == 0)
        x   1 //return odd on purpose!
    else
        x   1
} ensuring( _ % 2 == 0)
  

Комментарии:

1. Спасибо! Я об этом не подумал. Я добавил код из книги, где автор использует эту функцию. Применяет ли он это к части else там?

2. Я только что наткнулся на ту же проблему) Я думаю, да, в книге это применяется только для else, потому что делает расширение только в else части. Но мы можем поместить разные обеспечения в разные части кода