TCLOO:如何区分基本类型和对象

时间:2013-02-28 09:21:21

标签: tcl

如何在TclOO中区分基本类型(如字符串)和:: oo :: object?

2 个答案:

答案 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作为字符串传递?