Когда использовать операторы return в Scala? - PullRequest
0 голосов
/ 06 октября 2019

У меня есть некоторый код Python, и я хочу преобразовать его в Scala.

Код Python:

def temp(x):
    if(x == 5):
        return "equal to 5" //basically, this would be a guard clause in a real world example
    // Maybe do some processing
    return "not equal to 5"

print(temp(5)) //prints "equal to 5"
print(temp(6)) //prints "not equal to 5"

Я создаю таблицу Scala и пытаюсь перевестиэто строка за строкой, но результат не совпадает.

Scala-код:

object test {
  def temp(x: Int): String = {
    if (x == 5)
      "equal to 5"
    "not equal to 5"
  }                                               //> temp: (x: Int)String

  temp(5)                                         //> res0: String = not equal to 5
  temp(6)                                         //> res1: String = not equal to 5
}

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

Почему я не могу удалить его в этом контексте? Есть ли какой-нибудь другой способ использовать пункты охраны в scala? Или есть что-то еще, что вызывает неожиданный вывод?

1 Ответ

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

Ключ к пониманию в Scala: if-else выражения - это просто - выражения , а не управляющие структуры. Следовательно,

if (x == 5) "equal to 5"

не означает

", если x равно пяти, а затем вернуть пять",

, вместо этого это означает что-то вроде

"если x равно пяти, тогда оцените это выражение как пять, в противном случае оцените как неизвестное значение."

Фактически мы могли бы написать

val v: Any = if (x == 5) "equal to 5"

Примечаниекак тип v равен Any, потому что мы не предоставили часть выражения else, поэтому лучший компилятор может сделать вывод типа Any. Предоставляя условие else, мы имеем

val v: String = if (x == 5) "equal to 5" else "not equal to 5"

, где мы видим, что v теперь приятно набирается в String по мере необходимости. Теперь в Scala, если мы поместим выражение как выражение last в блоке, тогда оно станет возвращаемым значением функции. Таким образом,

def temp(x: Int): String = {
  if (x == 5)
    "equal to 5"
  "not equal to 5"
}  

эквивалентно

def temp(x: Int): String = {
  val v1: Any = if (x == 5) "equal to 5"
  // do nothing with v1

  val v2: String = "not equal to 5"
  return v2
}  

, где мы видим, что temp всегда будет возвращать только v2. Вместо этого мы должны написать просто

def temp(x: Int): String =
  if (x == 5) "equal to 5" else "not equal to 5"

Мы могли бы сказать, что выражение if-else действует как традиционная управляющая структура, только когда оно является последним выражением в блоке.


Более формально,в условное выражение if (?1) ?2 else ?3

  • Тип условного выражения - слабая наименьшая верхняя граница типов ?2 и?3

  • if (?1) ?2 оценивается так, как если бы оно было if (?1) ?2 else ().

, где () значение имеет тип Unitчто объясняется здесь .

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