Как получить ссылку на переменную-член класса Itcl? - PullRequest
0 голосов
/ 05 августа 2011

Скажите, у меня есть следующая структура:

package require Itcl


itcl::class AAA {

private variable m_list {}

constructor {} {
    fill m_list list
}

}

Как получить ссылку на m_list для записи

foreach elem $reference {.......} 

Считай, что этот список действительно большой, и я не хочу его копировать!

Ответы [ 2 ]

4 голосов
/ 05 августа 2011

Переменные Tcl используют семантику копирования при записи.Вы можете безопасно передавать значение, присваивая ему несколько переменных, не беспокоясь о том, что оно занимает больше места в памяти.

Например,

set x {some list} ;# there is one copy of the list, one variable pointing at it
set y $x          ;# there is one copy of the list, two variables pointing at it
set z $y          ;# there is one copy of the list, three variables pointing at it
lappend z 123     ;# there are two copies of the list
                  ;# x and y pointing at one
                  ;# z pointing at the other 
                  ;#     which is different from the first via an extra 123 at the end

Приведенный выше код приведет к двум гигантскимсписки, один с исходными данными, на которые оба x указывают y, и один с дополнительным элементом 123, на который указывает только z.До оператора lappend существовала только одна копия списка, и все три переменные указывали на него.

1 голос
/ 05 августа 2011

Вот как получить ссылку на члена класса:

package require Itcl


itcl::class AAA {

public variable m_var 5

public method getRef {} {

    return [itcl::scope m_var]
}

}


AAA a

puts [a cget -m_var]

set [a getRef] 10

puts [a cget -m_var]
...