Как вызвать itcl :: scope для произвольного объекта текущего класса? - PullRequest
0 голосов
/ 08 января 2012

itcl::scope возвращает полное имя указанной переменной-члена $this.

Как я могу вызвать itcl::scope для другого объектатот же класс (не для $this)?

Вот обходной путь.

itcl::class dummy {
    variable m_data

    method function { other } {
        if { [itcl::is object -class dummy $other] } {
            error "Invalid argument."
        }

        set name "@itcl $other [$other info variable m_data -name]"
        # OR
        set name [lreplace [itcl::scope m_data] 1 1 $other]

        puts "==== this is the name of m_data of of object $other: $name"
    }
}

Но это, мягко говоря, некрасиво.

Полагаю, $other info variable m_data -name должен вернуть то, что я хочу, но он просто пропускает контекст объекта.

1 Ответ

0 голосов
/ 10 января 2012

Нет хорошего способа получить эту информацию, да и не обязательно, чтобы ее получить.Обычно лучше рассматривать переменные объекта как часть реализации этого объекта, а не как часть его интерфейса.Таким образом, внешний код не должен копаться внутри;если важно, чтобы что-то за пределами объекта (включая других членов класса) обращалось к переменным, напишите метод, который возвращает ссылку на переменную (сгенерированную с помощью itcl::scope).

itcl::class dummy {
    variable m_data

    protected method dataRef {} { itcl::scope m_data }

    method function { other } {
        if { [itcl::is object -class dummy $other] } {
            error "Invalid argument."
        }

        set name [$other dataRef]

        puts "==== this is the name of m_data of of object $other: $name"
    }
}
...