如何在TclOO中区分基本类型(如字符串)和:: oo :: object?
答案 0 :(得分:2)
您可以使用info object isa object
精确确定值是否为对象的句柄:
if {[info object isa object $thing]} {
puts "Hey, $thing is an object!"
}
一般来说,Tcl的类型系统的所有值都至少是名义字符串。更严格地说,每个值都可以序列化为字符串。有些值也有其他性质(例如,数字也知道它们的数值)。 TclOO对象句柄是字符串和命令名称(因此可以是rename
d),以及(当然)对象句柄。
答案 1 :(得分:0)
愚蠢的回答:
# Since a normal string is unlikly to be "::oo::object", this will return 1
# if the argument is not ::oo::object
proc is_oo_object args {
string equals $arg ::oo::object
}
# gettype - higly accurate
proc gettype arg {
# EIAS
return "string"
}
简单回答:你不能。如果有人告诉你一个对象的名字,它就是一个字符串。 (参见Tcl / Tk wiki了解EIAS)
如果检查是否存在具有该名称的命令,您可以尝试猜测它是否是:: oo :: object:
if {[llength [namespace which $arg]]} {
....
}
这仍然不意味着这是一个:: oo :: object。
您可以尝试使用expr {[catch {info object class $arg ::oo::object} res] && $res}
进行检查,但是谁告诉您有人想要将oo::class
作为字符串传递?