0

我在我的 Swig 接口文件中有以下内容,用于连接一个小型 GUI 库的 .c/.h:

%{
    void Widget_name_set( Widget *widget, char *name )
    {
        if( !name ) return;

        WidgetSetName( widget, name );
    }


    char *Widget_name_get( Widget *widget )
    {
        return WidgetGetName( widget );
    }
%}


struct Widget
{
    %extend
    {           
        char name[ 32 ];

        Widget( void )
        {
            return WidgetNew();
        }


        ~Widget()
        {
            if( $self ) WidgetDelete( $self );
        }


        void SetName( char *name )
        {
            Widget_name_set( $self, name );
        }


        char *GetName()
        {
            return Widget_name_get( $self );
        }
    }
};

然后我使用接口文件生成一个 Lua 包装器。如果我在 Lua 中调用以下命令,结果几乎与预期一样:

w = Widget(); 
w:SetName("test");

一切都好。但如果我这样做:

w = Widget(); 
w.SetName( nil, "test" );

由于参数为零,它显然会崩溃。有没有办法(使用 Swig 接口或在 Lua 中)来抑制所有带点的调用,只保留带列的调用?像这样对用户来说会更容易,并且会避免我添加 1000 万个指针检查等......

4

1 回答 1

0

有没有办法(使用 Swig 接口或在 Lua 中)来抑制所有带点的调用,只保留带列的调用?

不,就 Lua 而言,这只是语义上的糖。使用.方法来访问成员。using:意味着当你调用函数时,第一个参数是被访问的表:

你可能甚至无法分辨出检查 Lua 反汇编的区别(尽管不可否认,这只是我的猜测);到那时,它可能已经转换为最终形式。

于 2012-04-24T23:38:26.450 回答