我正在尝试围绕http包写一个TclOO包装器。我们的想法是创建一个对象,传递您通常传递给http::geturl
的参数,并使用code
,data
,ncode
和meta
方法返回与相应的http::
proc相同的数据。为避免大量打字,我点击了以下内容:
oo::class create myHttp {
constructor {url args} {
set responses {data code ncode meta}
foreach response $responses {
oo::objdefine [self object] variable -append m_$response
oo::objdefine [self object] method $response {} [subst -nocommands {
puts stdout [lsort [info vars *]]
return [set m_$response]
}]
}
set tok [http::geturl $url {*}$args]
foreach response $responses {
set m_$response [http::$response $tok]
}
http::cleanup $tok
}
可悲的是它不起作用。
% set h [myHttp new http://www.google.co.uk]
% $h code
m_code m_data m_meta m_ncode
can't read "m_code": no such variable
这里发生了什么? [info vars]的输出表明存在m_code
,但错误表明它不存在。直接从[info object namespace $h]
命名空间访问变量表明它们都存在且具有预期值,但所有访问器方法都失败并出现相同的错误。
有没有更好的方法来“自动生成”方法和变量?我坦率地承认,我没有完全了解使用oo::objdefine
而不是oo::class create
语句定义方法,我尝试添加,半随机,my variable m_$response
和{ variable m_$response
方法中的{1}}语句无济于事。我担心会发现自己在$reponse
使用这里,因为我通常会在以后的评论中发现,一个简单的subst
可以充分发挥作用并且不那么不透明。
为了完整起见,我在Windows 7上使用ActiveState发行版使用Tcl 8.6.4,并使用TkCon进行调试。
答案 0 :(得分:2)
我把它写成
oo::class create myHttp {
variable tok
constructor {url args} {
set tok [http::geturl $url {*}$args]
foreach response {data code ncode meta} {
oo::objdefine [self] forward $response http::$response $tok
}
}
destructor {
http::cleanup $tok
}
}
但是如果你真的需要变量用于某种目的,那显然不会起作用。