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" );

パラメータがnilであるため、明らかにクラッシュします。(Swig インターフェイスまたは Lua のいずれかを使用して) ドットですべての呼び出しを抑制し、列を持つものだけを保持する方法はありますか? このようにすると、ユーザーにとってより簡単になり、ポインタなどの1000万回のチェックを追加する必要がなくなります...

4

1 に答える 1

0

(Swig インターフェイスまたは Lua のいずれかを使用して) ドットですべての呼び出しを抑制し、列を持つものだけを保持する方法はありますか?

いいえ。Lua に関する限り、これはセマンティック シュガーにすぎません。.メンバーにアクセスするだけの手段を使用します。Using:は、関数を呼び出すときに、最初のパラメーターが でアクセスされるテーブルであることを意味します:

おそらく、Lua の逆アセンブルを検査しても違いはわかりません (確かに、これは私の推測にすぎません)。それまでに、おそらく最終的な形に変換されています。

于 2012-04-24T23:38:26.450 に答える