Object TclOO:对象等于
TclOOObject TclOO:对象等于,object,tcl,equals,Object,Tcl,Equals,TclOO对象等于实现的惯用模式是什么 也许比较串联排序 有类似于Scala的吗?TclOO在设计上没有为您定义平等系统;由于对象通常是可修改的,因此除了对象标识之外,没有自动应用的概念,您只需比较对象的名称就可以得到它(或者比较info-object-namespace$theObj,如果您非常偏执的话;我认为Tcl 8.7将提供更多选项,但这尚未被接受) 如果您想定义一个平等制度,如您所提议的,您可以这样做: oo::class create PropertyEquals { met
对象等于
实现的惯用模式是什么
也许比较串联排序
有类似于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
,cleanwith clone
等)为什么需要属性
方法,为什么不使用mixin提供的info object variables | vars
实现一个通用(默认)实现呢?允许开发人员完善平等协议当然是好的,但在一般情况下,内省可以起到解救作用。。。