obj_set_methods setzt Methoden (Member-Funktionen) für das Objekt.
Returnwert
bool ist TRUE (1), wenn die Funktion erfolgreich war und sonst FALSE (0).
Parameter
obj ist ein mit obj_create erzeugtes Objekt.
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