2016-09-28 1 views
1

Я делаю некоторые исследования на лестницу разрядном режиме, как показано ниже:Scala немного операция

scala> val b = 8 
b: Int = 8 

scala> var c:Int = b | (1<<4) 
c: Int = 24 

scala> var c:Int = c | (1<<5) 
c: Int = 32 

Я не понимаю, почему результат выглядит правильно, когда правопреемником значение от б до с, но выглядит неправильно, когда от с до сам. Ожидаемый результат - 56 для третьего оператора. Кто-нибудь знает почему?

ответ

2

В третьей строке вы переопределяете переменную c. РЕПЛ по-видимому, работает таким образом, что он сначала создает переменную, которая устанавливается на значение по умолчанию 0, а затем он делает 0 | (1 << 5) что 32.

Решение: Не переопределить переменную c, просто росчерк:

scala> val b = 8 
b: Int = 8 

scala> var c: Int = b | (1 << 4) 
c: Int = 24 

scala> c = c | (1 << 5)  // Don't redefine c, just reassign it 
c: Int = 56 

В «реальной» программе (не в REPL) вы не можете определить одну и ту же переменную с тем же именем более одного раза в той же области. Вы получите ошибку компилятора, если попытаетесь переопределить переменную c.

+0

Большое спасибо Jesper! – Lionel

0

Поскольку вы используете repl, вы перефинансируете переменную c. Так на линии

var c:Int = c | (1<<5) 

Это equivilant из

var c:Int = 0 | (1<<5) 

Что 32. Если вы используете новую переменную типа D, то вы получите 56, как можно было бы ожидать.

+0

Спасибо, Кевин! – Lionel