变量由`info vars`列出,但无法访问

时间:2016-06-03 09:56:33

标签: tcl

我正在尝试围绕http包写一个TclOO包装器。我们的想法是创建一个对象,传递您通常传递给http::geturl的参数,并使用codedatancodemeta方法返回与相应的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进行调试。

1 个答案:

答案 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
    }
}

但是如果你真的需要变量用于某种目的,那显然不会起作用。