Подтвердить что ты не робот

X = y = 1 в Scala?

Просматривая книгу Scala для нетерпимого, я столкнулся с этим вопросом:

Придумайте одну ситуацию, когда присваивание x = y = 1 справедливо в Scala. (Подсказка: выберите подходящий тип для x.)

Я не уверен, что именно автор имеет в виду по этому вопросу. Назначение не возвращает значение, поэтому что-то вроде var x = y = 1 должно возвращать Unit() как значение x. Может кто-нибудь указать, что я могу здесь пропустить?

Спасибо

4b9b3361

Ответ 1

Фактически, x Unit в этом случае:

var y = 2
var x = y = 1

можно прочитать как:

var y = 2
var x = (y = 1)

и, наконец:

var x: Unit = ()

Ответ 2

Вы можете перейти к типу x=y=1 в оболочке REPL без ошибок:

var x:Unit = {}
var y = 0
x = y = 1

Ответ 3

Вот еще один менее известный случай, когда метод setter возвращает свой аргумент. Обратите внимание, что тип x на самом деле Int здесь:

object AssignY {
  private var _y: Int = _
  def y = _y
  def y_=(i: Int) = { _y = i; i }
}

import AssignY._

var x = y = 1

(Эта функция используется в библиотеке XScalaWT и обсуждалась в этом вопросе.)

Ответ 4

BTW, если требуется присвоение того же значения для обеих переменных, которые все еще требуются, используйте:

scala> var [email protected] = 1
x: Int = 1
y: Int = 1