Vorheriges Thema

obj_set_at

Nächstes Thema

obj_set_parent

Diese Seite

obj_set_methods

obj_set_methods setzt Methoden (Member-Funktionen) für das Objekt.

bool = obj_set_methods(obj, m)

Returnwert

bool ist TRUE (1), wenn die Funktion erfolgreich war und sonst FALSE (0).

Parameter

obj

obj ist ein mit obj_create erzeugtes Objekt.

m

m ist ein mit obj_create erzeugtes Objekt, das Funktionsnamen enthält (siehe Kommentar).

Beispiel

def my_obj_print(this)
{
    k = this.keys
    for (i in 1:len(k)) {
        printf("%s = ", k[i]);
        print this[k[i]]
    }
}
def my_methods()
{
    m = obj_create();
    m.print = "my_obj_print";
    m.__print__ = "my_obj_print";
    return m;
}
def my_create()
{
    this = obj_create();
    set_method_table(this, "my");
    return this;
}
o = my_create()
o.a = 1
o.b = 2
o
print o
o.print

Kommentar

Um ein Objekt um Funktionen (auch Member-Funktionen oder Methoden genannt) zu erweitern muss ein Objekt erzeugt werden, dass die Namen der Methoden den UniScript-Funktionsnamen zuordnet.

Beispiel:

obj = obj_create()
m = obj_create();
m.test = "my_test";
obj.set_methods(m);

Falls nun die Anweisung

obj.test(1,2,3)

ausgeführt wird, versucht der UniScript-Interpreter die Funktion “my_test” aufzurufen. Der Interpreter übergibt der Funktion “my_test” als ersten Parameter zusätzlich das Objekt obj als ersten Parameter.

Die Funktion “my_test” kann folgendermaßen geschrieben werden:

def my_test(ob, a, b, c)
{
    // do something with ob, a, b, c
    return 123;
}

Neben den gewöhnlichen Methodennamen

m.name = "uniscript function name";

gibt es spezielle Namen die mit 2 Unterstrichen anfangen und enden (__name__). Momentan sind folgende spezielle Namen definiert:

__destructor__
__print__
__format__
__getprop__
__setprop__
__veceval__
__vecassign__

__destructor__

Falls im Methoden-Objekt ein Element __destructor__ existiert, wird die angegebene Destruktor-Funktion aufgerufen, wenn das Objekt ungültig wird.

Beispiel:

m.__destructor__ = "file_close";

Die Destruktor-Funktion muss einen Parameter haben.

def file_close(file)
{
    fclose(file.fp);
}
f = file_open(...)
f = 0;

__print__

Die __print__-Methode wird aufgerufen, wenn der Objekt-Name im Kommando-Fenster eingegeben wird, oder die Print-Anweisung mit dem Objekt ausgeführt wird.

__format__

Die __format__-Methode wird aufgerufen, wenn während des debuggens der Cursor über eine Objekt-Variable gehalten wird. Die Format-Funktion sollte eine Zeichenkette zurückgeben, die dann angezeigt wird.

Beispiel:

def file_tooltip(file)
{
    return sprintf("fp = %d\nname = %s", file.fp, file.name);
}

__setprop__

Mit __setprop__ kann eine UniScript-Funktion aufgerufen werden, wenn eine Anweisung der Form obj.prop = value ausgeführt wird.

Beispiel:

def prop_set_func(obj, val)
{
    obj["prop_name"] = val;
}

Innerhalb der property-set-Funktion darf die Form obj.prop = value nicht verwendet werden, sonst würde sich die Funktion endlos rekursiv aufrufen. Es sollte eine der beiden Formen

obj["prop_name"] = val;
obj.set_at("prop_name", val);

verwendet werden.

__setprop__ wird folgendermaßen definiert:

m.__setprop__ = obj_create();
m.__setprop__.prop_name = set_name_func;

__getprop__

__getprop__ wird verwendet, wenn ein Ausdruck der Form obj.prop auf der rechten Seite verwendet wird: val = obj.prop.

def prop_get_func(obj)
{
    return obj["prop_name"];
}

__veceval__

Wird bei Ausdrücken wie v = obj[index] aufgerufen.

def vec_eval_func(obj, index)
{
    return obj.lookup(index);
}

__vecassign__

Wird bei Ausdrücken wie obj[index] = val aufgerufen.

def vec_assign_func(obj, index, val)
{
    obj.set_at(index, val);
}

Zusammenfassung

m = obj_create();
m.name = name_func;
m.__destructor__ = destroy_func;
m.__print__ = print_func;
m.__format__ = format_func;
m.__vecassign__ = vecassign_func;
m.__veceval__ = veceval_func;
m.__getprop__ = obj_create();
m.__getprop__.prop_name = get_name_func;
m.__setprop__ = obj_create();
m.__setprop__.prop_name = set_name_func;

id-1457530