- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 TclOO
,发现我们可以使用 create
或 new
来创建对象。使用 create
,我们可以提供自定义名称,而使用 new
,它是计算机生成的。
#!/bin/bash
#\
exec tclsh8.6 $0 $@
::oo::class create calc {
method add { a b } {
return [ expr {$a+$b} ]
}
}
calc create c;
set t [ calc new ]
# Both serves the same purpose here
puts [ c add 3 4 ]
puts [ $t add 1 2 ]
是否仅仅是编译器为开发者提供的对象命名便利?另外,在什么情况下我应该更喜欢 new
而不是 create
?
最佳答案
new
和 create
之间的唯一区别是 exactly create
允许您指定要使用的名称, new
为您制作了一个新的。某些类型的对象(特别是类)隐藏了它们的 new
方法,因此强烈建议您只创建命名实例——考虑到人们如何使用类,这在实践中很有意义——但这只是隐藏如果你愿意,你可以覆盖它:
oo::define oo::class {
export new
}
当您不关心名称而只是希望它与其他名称不同时,请使用 new
。这是基本的经验法则。
使用 create
来创建其他 OO 系统可能使用单例的实例也是完美的。有什么比给他们一个由您控制的好听的独特名称更独特的呢。
我知道的主要场景是,当您想要将一个对象的生命周期绑定(bind)到另一个对象时,使用 create
更有用。在这种情况下,在另一个对象的上下文中创建对象会将对象句柄放入容器的命名空间中,并会在删除容器时自动触发删除:
oo::class create InsideThing {
constructor {} {
puts "Made a [self] that is an InsideThing"
}
destructor {
puts "Deleted a [self] that is an InsideThing"
}
}
oo::class create Container {
constructor {} {
puts "Created a [self] that is a Container"
InsideThing create inner1
InsideThing create inner2
}
destructor {
puts "Deleted a [self] that is a Container"
}
}
set c [Container new]
puts "Do stuff..."
$c destroy
如果您运行该代码,您会得到:
Created a ::oo::Obj13 that is a ContainerMade a ::oo::Obj13::inner1 that is an InsideThingMade a ::oo::Obj13::inner2 that is an InsideThingDo stuff...Deleted a ::oo::Obj13 that is a ContainerDeleted a ::oo::Obj13::inner1 that is an InsideThingDeleted a ::oo::Obj13::inner2 that is an InsideThing
此技术在 TDBC 中广泛使用,以在其容器(分别为语句和连接)的上下文中管理结果集和语句。
最后,如果您使用 TclOO 创建 Tk megawidgets,您将肯定使用 create
但是以覆盖的形式,因为 Tk widgets 必须具有以 .
开头的非限定名称,并且具有特定的体现层次结构,并且强烈建议 megawidgets 遵循相同的模式。因为名称在这种情况下很重要,new
是错误的方法;最好从 create
开始。 Tk 8.6 有一些支持类(未公开描述,但在内部用于某些对话框)使这类事情变得更容易:tk::Megawidget
和 tk::MegawidgetClass
。查看megawidget.tcl
在 Tk 8.6 发行版中获取详细信息。
关于tcl - 使用 TclOO 在对象创建中创建与新建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26546961/
我正在研究 TclOO,发现我们可以使用 create 或 new 来创建对象。使用 create,我们可以提供自定义名称,而使用 new,它是计算机生成的。 #!/bin/bash #\ exec
在 itcl 中,可以在允许的类中创建一个 proc namespace eval ns {set ::ns::i 0} ::itcl::class clsTest { set ::ns::i
如何设置 TclOO 跨对象命名空间传输? 具体来说,在下面的例子中: runner对象需要将其方法命名空间导出为命令 和 invoker对象需要导入 runner用作 DSL 的命名空间 Tcl 8
我想知道是否有人可以解释为什么我可以在嵌套的 proc 中成功链接 upvars 的幕后细节,但它在嵌套的 TclOO 方法中不起作用(在子类中覆盖的那些方法)。 (有人告诉我,在 TclOO 类方法
作为我不能做的事的一个简短例子: #include #include int main(void) { Tcl_Interp *interp = Tcl_CreateInterp();
我正在对 Tcl8.6 和 Rivet 中的 TclOO 进行一些试验,但我遇到了麻烦,因为我无法做我想做的事。 问题可以简单地通过 .rvt 中的以下代码重现。文件: proc dumbpro
我是一名优秀的程序员,十分优秀!