Переменные в операторе if-оператора - PullRequest
8 голосов
/ 13 января 2012

Часто у меня возникает желание создать переменные, ограниченные оператором if. Некоторые вычисления относятся только к определенному утверждению «если» - загрязнение внешнего объема временными переменными пахнет плохо.

Что бы я хотел сделать:

val data = (whatever)

if (val x = data*2+5.4345/2.45; val y = data/128.4; x*y < 10) 
  x * y
else
  x * 2

println(x) //ERROR!

Одна альтернатива довольно грязная:

val data = (whatever)

if (data*2+5.4345/2.45*data/128.4 < 10) 
  data*2+5.4345/2.45*data/128.4
else
  data*2+5.4345/2.45 * 2

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

val data = (whatever)
val x = data*2+5.4345/2.45
val y = data/128.4

if (x*y < 10) 
  x*y
else
  x * 2

println(x) //OK

Возможно ли что-то подобное в Scala? Есть ли достойный обходной путь? Если нет, то какие другие языки поддерживают такую ​​идею?

Ответы [ 3 ]

20 голосов
/ 13 января 2012

Поскольку if в Scala является выражением, т. Е. Оно возвращает значение, обычно вы устанавливаете какое-то значение в результате выражения if.Таким образом, ваш третий вариант вполне подходит: поместите его в блок кода, т.е.

5 голосов
/ 13 января 2012

Вы можете использовать сопоставление с шаблоном:

val data = 123

val (result, x) = (data*2+5.4345/2.45, data/128.4) match {
  case (x, y) if x * y < 10 => (x * y, x)
  case (x, _)               => (x * 2, x)
}

println(x)

result содержит результат x * y или x * 2, в зависимости от того, какое вычисление было выполнено, а x содержит значение data*2+5.4345/2.45 по желанию.

1 голос
/ 13 января 2012

Вы можете создать область действия для него ...

{
  val x = data*2+5.4345/2.45
  val y = data/128.4;
  if ( x*y < 10) 
    x * y
  else
    x * 2
}

Или, чтобы сделать его более понятным,

locally {
  val x = data*2+5.4345/2.45
  val y = data/128.4;
  if ( x*y < 10) 
    x * y
  else
    x * 2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...