перегрузка opIndexAssign - PullRequest
       22

перегрузка opIndexAssign

4 голосов
/ 09 июля 2011

У меня возникли проблемы с перегрузкой opIndexAssign в одном из моих классов.

У меня есть класс;JSObject, который определен так:

alias char[] String;

...

class JSObject : Dobject
{
    /*****************************************************************
    * Constructors
    ******************************************************************/
    this( Dobject dobj )
    {
        super( dobj ) ;
    }

    this()
    {
        super( null ) ;
    }

    this( AssociativeArray data )
    {
        // initiate
        super( null ) ;

        // then populate
        foreach( k, v ; data )
        {
            this[ k ] = v ;
        }
    }

    public void opIndexAssign( String key , String val )
    {
        Value* v = new Value() ;
        v.putVstring( val ) ;
        this.Put(key, v , DontDelete);
    }

    public void opIndexAssign( String key , Dobject dobj )
    {
        Value* v = new Value() ;
        v.putVobject( dobj ) ;
        this.Put(key, v , DontDelete);
    }

    public void opIndexAssign( String key , JSObject jso )
    {
        Value* v = new Value() ;
        v.putVobject( jso ) ;
        this.Put(key, v , DontDelete);
    }

    public Value* opIndex( String key )
    {
        return this.Get( key ); 
    }

}

Суперкласс Dobject перегружен методами put () и get (), и я пытаюсь обернуть их такЯ могу получить к ним доступ как к ассоциативным массивам:

77: JSObject jso = new JSObject() ;
78: jso[ "foo" ] = "bar" ;
79: 
80: JSObject jsoParent = new JSObject() ;
81: jsoParent[ "child" ] = jso ;

Он работает для метода String, String, но когда я пытаюсь использовать JSObject в качестве значения, он терпит неудачу.

test2.d => test2
+ c:\dmd\dsss\bin\rebuild.exe -version=PhobosCompatibility -w  -Idsss_imports\ -I. -S.\ -Ic:\dmd\dsss\include\d -Sc:\dmd\dsss\lib\ -Ic:\dmd\dsss\include\d -Sc:\dmd\dsss\lib  -oqdsss_objs\D  -debug -gc test2.d -oftest2 
test2.d(81): Error: function dmdscripttest.JSObject.opIndexAssign (char[],char[]) does not match parameter types (JSObject,char[5u])
test2.d(81): Error: cannot implicitly convert expression (jso) of type dmdscripttest.JSObject to char[]
test2.d(81): Error: cannot implicitly convert expression ("child") of type char[5u] to dmdscripttest.JSObject
Error: Command failed, aborting.
Command c:\dmd\dsss\bin\rebuild.exe returned with code 1, aborting.

I 'Я немного растерялся из-за того, что я делаю неправильно.Это похоже на то, как компилятор пытается привести его в соответствие с opIndexAssign (String, String) вместо метода opIndexAssign (String, JSObject).

Я неправильно определил функции opIndexAssign?

Спасибо завперед,

1 Ответ

8 голосов
/ 09 июля 2011

проблема в том, что opIndexAssigne сначала нужно значение, а затем ключи (или индексы)

http://www.d -programming-language.org / operatoroverloading.html # Назначение

поэтому вы захотите определить его как

public void opIndexAssign(  String val , String key)
{
    Value* v = new Value() ;
    v.putVstring( val ) ;
    this.Put(key, v , DontDelete);
}

public void opIndexAssign( Dobject dobj , String key)
{
    Value* v = new Value() ;
    v.putVobject( dobj ) ;
    this.Put(key, v , DontDelete);
}

public void opIndexAssign( JSObject jso , String key)
{
    Value* v = new Value() ;
    v.putVobject( jso ) ;
    this.Put(key, v , DontDelete);
}

. Причина, по которой это сделано, заключается в том, что вы можете определить vararg для индекса

...