TclOO: объект равен - PullRequest
0 голосов
/ 18 мая 2018

Что такое идиоматический шаблон для реализации TclOO object equals?

Возможно сравнить объединенные отсортированные списки всех свойств ?

Есть ли аналоги для случая Scala классы

1 Ответ

0 голосов
/ 18 мая 2018

TclOO не определяет для вас систему равенства;поскольку объекты в целом модифицируемы, не существует автоматического понятия, которое могло бы применяться, кроме идентификации объекта, и вы можете просто сравнить имя объекта, чтобы получить его (или результаты info object namespace $theObj, если вы очень параноидальны;Я думаю, что Tcl 8.7 предоставит больше вариантов, но это еще не принято).

Если вы хотите определить систему равенства, такую ​​как вы предлагаете, вы можете сделать это:

oo::class create PropertyEquals {
    method equals {other} {
        try {
            set myProps [my properties]
            set otherProps [$other properties]
        } on error {} {
            # One object didn't support properties method
            return 0
        }
        if {[lsort [dict keys $myProps]] ne [lsort [dict keys $otherProps]]} {
            return 0
        }
        dict for {key val} $myProps {
            if {[dict get $otherProps $key] ne $val} {
                 return 0
            }
        }
        return 1
    }
}

Тогда вам просто нужно определить метод properties для класса, который вы, возможно, сравниваете, и смешать в методе equals, описанном выше.

oo::class create Example {
    mixin PropertyEquals
    variable _x _y _z
    constructor {x y z} {
        set _x $x; set _y $y; set _z $z
    }
    method properties {} {
        dict create x $_x y $_y z $_z
    }
}

set a [Example new 1 2 3]
set b [Example new 2 3 4]
set c [Example new 1 2 3]
puts [$a equals $b],[$b equals $c],[$c equals $a]; # 0,0,1

Обратите внимание, что Tcl не предоставляет сложные классы коллекциикак и некоторые другие языки (потому что он имеет открытые значения, подобные массиву и отображению), и поэтому для его поддержки не требуется структура равенства объектов (или хеширования содержимого).

...