Почему обеспечение работает только на других? - PullRequest
9 голосов
/ 30 апреля 2011

В 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!

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

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

РЕДАКТИРОВАТЬ: В книге «Программирование в 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

Применяет ли он ее только к другой части здесь?

1 Ответ

19 голосов
/ 30 апреля 2011

Да, если 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)
...