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 не предоставляет сложные классы коллекциикак и некоторые другие языки (потому что он имеет открытые значения, подобные массиву и отображению), и поэтому для его поддержки не требуется структура равенства объектов (или хеширования содержимого).