我们可以在 tclOO 中定义静态函数吗?

har*_*ant 2 tcl

在 itcl 中,可以在允许

namespace eval ns {set ::ns::i 0}

::itcl::class clsTest { 
    set ::ns::i 0 ; 
    proc i {} {
        return [incr ::ns::i]
    }
}

clsTest::i
1
Run Code Online (Sandbox Code Playgroud)

在 tclOO 中是否有一些支持?

Don*_*ows 5

类(大部分)是 TclOO 中的普通对象,因此您可以执行诸如在类本身上创建实例方法之类的操作。这就是self类声明上下文的用途,它是一种强大的技术:

oo::class create clsTest {
    self {
        variable i
        method i {} {
            return [incr i]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

之后,您可以执行以下操作:

clsTest i
# ==> 1
clsTest i
# ==> 2
clsTest i
# ==> 3
Run Code Online (Sandbox Code Playgroud)

请注意,newcreate实际上只是多数为普通预定义的方法(即发生在C来实现),但您可以添加其他几乎任何你想要的。当然oo::class继承自oo::object.

如果您要使类级方法也显示为可在实例上调用的方法,则您只需要技巧。我真的不推荐它,但可以使用转发方法:

oo::class create clsTest {
    self { ... }
    # This is actually the simplest thing that will work, provided you don't [rename] the class.
    # Use the fully-qualified name if the class command isn't global.
    forward i  clsTest i
}
Run Code Online (Sandbox Code Playgroud)