1

基本型 (文字列など) と ::oo::object を TclOO で区別するにはどうすればよいですか?

4

2 に答える 2

2

を使用して、値がオブジェクトのハンドルであるかどうかを正確に判断できますinfo object isa object

if {[info object isa object $thing]} {
    puts "Hey, $thing is an object!"
}

ただし、一般的に言えば、Tcl の型システムではすべての値が少なくとも名目上の文字列です。より厳密には、すべての値は文字列にシリアライズ可能です。一部の値には他の性質もあります (たとえば、数値はその数値性についても知っています)。TclOO オブジェクト ハンドルは、文字列、コマンド名 (したがってrenamed にすることができます)、および (もちろん) オブジェクト ハンドルです。

于 2013-03-01T07:21:27.657 に答える
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"
}

簡単な答え:できません。誰かがあなたにオブジェクトの名前を渡した場合、それは文字列です。( EIASについてはTcl / Tk wikiを参照してください)

その名前のコマンドが存在するかどうかを確認すると、:: oo::objectであるかどうかを推測できます。

if {[llength [namespace which $arg]]} {
    ....
}

これは、これが:: oo::objectであることを意味するものではありません。で調べてみることができますが、誰かが文字列としてexpr {[catch {info object class $arg ::oo::object} res] && $res}渡したいと言ったのは誰ですか?oo::class

于 2013-02-28T12:59:50.213 に答える