Object TclOO:对象等于

Object TclOO:对象等于,object,tcl,equals,Object,Tcl,Equals,TclOO对象等于实现的惯用模式是什么 也许比较串联排序 有类似于Scala的吗?TclOO在设计上没有为您定义平等系统;由于对象通常是可修改的,因此除了对象标识之外,没有自动应用的概念,您只需比较对象的名称就可以得到它(或者比较info-object-namespace$theObj,如果您非常偏执的话;我认为Tcl 8.7将提供更多选项,但这尚未被接受) 如果您想定义一个平等制度,如您所提议的,您可以这样做: oo::class create PropertyEquals { met

TclOO
对象等于
实现的惯用模式是什么

也许比较串联排序


有类似于Scala的吗?

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不像其他一些语言那样提供复杂的集合类(因为它有类似于数组的开放值和类似于映射的开放值),因此不需要对象相等(或内容哈希)框架来支持它。

很高兴知道,谢谢。我们也在考虑使用
yaml
类序列化的副产品,并将
equals->toYAML
映射到
;唯一棘手的是没有默认值。如果有默认值,它可能会使用
info object creationid
,它是内部比较的一部分,并且是用于内部比较的值(用于缓存管理,因此不会真正公开脚本)。@DonalFellows灵活性很好,然而,在默认情况下,将基于
案例类
值对象包含到TclOO中可能会使事情变得更简单(提供
等于
属性方法
toString
toYaml
,clean
with clone
等)为什么需要
属性
方法,为什么不使用mixin提供的
info object variables | vars
实现一个通用(默认)实现呢?允许开发人员完善平等协议当然是好的,但在一般情况下,内省可以起到解救作用。。。