Scala неизменяемые переменные и печать - PullRequest
4 голосов
/ 13 сентября 2011

В настоящее время я использую класс, использующий Scala, который я никогда раньше не использовал, поэтому синтаксис и сам по себе новый.

Я работаю над простой функцией деления, но сталкиваюсь с некоторыми ошибками.

Прежде всего, я использую var sub = m, верно?В моем коде я просто хотел сделать m = mn, но вы не можете изменить переменную, и я не уверен, что это лучшая альтернатива.Тогда моя единственная другая проблема заключается в том, что компилятор лает на меня из-за моей строки печати ..

<console>:14: error: reassignment to val
        m = m-n

/////////////////////////////////////////////////////////////////////////////////

<console>:16: error: type mismatch;
 found   : Unit
 required: Int
        println(x)

/////////////////////////////////////////////////////////////////////////////////////

def div(m: Int, n: Int): Int = {
    var x = 0
    var sub = m
    if (n > m)
        print("Can't perform that.")

    while (sub >= n) {
        x+=1
        sub = sub-n
    }
println(x)
}

Ответы [ 2 ]

7 голосов
/ 13 сентября 2011

Проблема на самом деле ваше возвращаемое значение.Вы объявили div для возврата Int, и компилятор (в вашем случае) предполагает, что ваше последнее утверждение будет вашим возвращаемым значением.Поскольку println возвращает Unit (это void функция), компилятор в замешательстве.

Вы можете явно вернуть значение, сказав return x в любом месте вашей функции, или вы можете поставить x как последний оператор в функции (или один конкретный путь выполнения в этой функции).Например:

def what(b:Boolean):Int = {
  if(b) 1
  else 0
}

(Scala позволит мне написать def what(b:Boolean) = if(b) 1 else 0, и это будет точно такая же функция, как указано выше, но это не относится к делу.)

Для удобствавот ваша функция с модификацией, которую я описал:

def div(m: Int, n: Int): Int = {
  var x = 0
  var sub = m
  if (n > m)
    print("Can't perform that.")

  while (sub >= n) {
    x+=1
    sub = sub-n
  }
  println(x)
  x // <--- return value
}
3 голосов
/ 13 сентября 2011

Для полноты, поместим более идиоматическое рекурсивное определение здесь:

def div(m: Int, n: Int): Int = {
  @annotation.tailrec
  def loop(count: Int, sub: Int): Int = 
    if (sub < n) count
    else loop(count + 1, sub - n)

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