#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 части. Но мы можем поместить разные обеспечения в разные части кода