2016-12-15 8 views
0
class Cell(var x: Int) 
    var c = new Cell(1) 

    val f1 =() => c.x /* Create a closure that uses c */ 

    def foo(e: Cell) =() => e.x /* foo is a closure generator with its own scope */ 

// f2 wont do any reference/deep copy 
    val f2 = foo(c) /* Create another closure that uses c */ 

    val d = c /* Alias c as d */ 
    c = new Cell(10) /* Let c point to a new object */ 
    d.x = d.x + 1 /* Increase d.x (i.e., the former c.x) */ 

    // now c.x refers to 10 
    println(f1()) /* Prints 10 */ 
    println(f2()) /* Prints 2 */ 

Здесь f2() печатает 2, Как обыкновение делать Скала глубокой копии, поэтому значение по-прежнему сохранялось как 1, это должно быть 10 .. где я буду неправильноScala закрытие лексическую область

2) Я прочитал smomehere, Закрытие в scala не глубоко копирует объекты, они просто продолжают ссылаться на объект. что это точно означает

ответ

1

Ваш пример несколько сложно понять из-за того, как вы его скопировали (похоже, что весь код запускается при создании Ячейки, но вы получите бесконечную рекурсию, если бы это было правдой). Причина, по которой f1 и f2 возвращают разные результаты, это то, что они указывают на разные ячейки. Вы правы в том, что, когда вы пишете:

оба c и d содержат одинаковые ссылки. Но когда вы пишете:

c = new Cell(10) 

c теперь ссылка на новую ячейку, и d не будет копировать эту ссылку.

Это легче увидеть с помощью REPL, который может печатать шестнадцатеричные ссылочные позиции.

scala> class Cell(var x: Int) 
defined class Cell 

scala> var a = new Cell(5) 
a: Cell = [email protected] 

scala> val b = a 
b: Cell = [email protected] 

Мы можем видеть, что a и b содержат ссылки на одну и ту же ячейку.

scala> a.x = 10 
a.x: Int = 10 

scala> b.x 
res0: Int = 10 

Когда мы обновляем класс, на который ссылается a, он также обновляется для b.

scala> a = new Cell(7) 
a: Cell = [email protected] 

scala> b 
res1: Cell = [email protected] 

scala> a.x 
res2: Int = 7 

scala> b.x 
res3: Int = 10 

Когда мы относим нашу переменную а к новой ячейке, она имеет другое местоположение ссылки (это другой экземпляр Cell). b все еще имеет такую ​​же ссылку (почему бы и нет?).

 Смежные вопросы

  • Нет связанных вопросов^_^