Ответ 1
Фактически, x
Unit
в этом случае:
var y = 2
var x = y = 1
можно прочитать как:
var y = 2
var x = (y = 1)
и, наконец:
var x: Unit = ()
Просматривая книгу Scala для нетерпимого, я столкнулся с этим вопросом:
Придумайте одну ситуацию, когда присваивание x = y = 1 справедливо в Scala. (Подсказка: выберите подходящий тип для x.)
Я не уверен, что именно автор имеет в виду по этому вопросу. Назначение не возвращает значение, поэтому что-то вроде var x = y = 1
должно возвращать Unit() как значение x. Может кто-нибудь указать, что я могу здесь пропустить?
Спасибо
Фактически, x
Unit
в этом случае:
var y = 2
var x = y = 1
можно прочитать как:
var y = 2
var x = (y = 1)
и, наконец:
var x: Unit = ()
Вы можете перейти к типу x=y=1
в оболочке REPL без ошибок:
var x:Unit = {}
var y = 0
x = y = 1
Вот еще один менее известный случай, когда метод 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 и обсуждалась в этом вопросе.)
BTW, если требуется присвоение того же значения для обеих переменных, которые все еще требуются, используйте:
scala> var [email protected] = 1 x: Int = 1 y: Int = 1