Skyrim:Function Reference
Funktionen sind Arbeitseinheiten, die größer als ein einzelner Ausdruck sind. Sie können verschiedene Parameter aufnehmen und geben einen Wert an den Aufrufer zurück.
Inhaltsverzeichnis
Funktionsdefinition
<function> ::= <function header> [<function block> 'endFunction']
Dem Function-Header muss immer ein Block und ein "EndFunction" Keyword folgen, es sei denn sie sind eingebaute Funktionen (die vom Spiel angeboten werden) .
Function-Header
<function header> ::= [<type>] 'Function' <identifier> '(' [<parameters>] ')' ('global' | 'native')* <flags>*
Ein Function-Header beginnt (optional) mit dem Rückgabe-Typ der Funktion gefolgt vom Namen der Funktion, deren Parameters (soweit vorhanden), Modifikatoren und Flags. Der identifier, der für die Namensgebung der Funktion genutzt wird, darf nicht mit anderen Funktionen im Script im Widerspruch stehen. Wenn der Identifier mit einer Funktion im Parent-Script überinstimmt, müssen der Typ des Rückgabewertes und die Parameter mit denen im Parent übereinstimmen – und die Funktion übersteuert die Funktion des Parent Die "Global"-Flag zeigt eine Funktion an, die überhaupt nicht auf einem Ingame-Objekt läuft und auch keine "Self"-Variable hat. Das "Native"-Flag zeigt eine Funktion an, die keinen Funktionskörper hat, weil die Funktion im Spiel selbst implementiert ist. Wenn man die "Native"-Flag einer Funktion hinzu fügt, deckt das Spiel dies nicht auf, der Compiler beklagt sich nicht, aber es wird beim Spiel nur ein Fehler angezeigt. Die selbe Flag kann nicht mehr als einmal spezifiziert werden.
Parameter
<parameters> ::= <parameter> (',' <parameter>)* <parameter> ::= <type> <identifier> ['=' <constant>]
Die Parameterliste ist eine durch Kommata getrennte Liste von Typen und Indentifiern, die die verschiedenen von der Funktion übernommenen Parameter abbilden. Jeder Parameter kann optional von einem Gleichheitszeichen und einer Konstante gefolgt sein. Dies zeigt, dass der Parameter dies als voreingestellten Wert hat. Wenn ein Parameter einen voreingestellten Wert hat, muss jeder nachfolgende Parameter auch einen voreingestellten Wert haben. Parameter sind im Grunde Variablen auf die die Funktion zugreifen kann und denen der Aufrufen Anfangswerte geben kann.
Funktions-Block
<function block> ::= <statement>*
Der Funktions-Block enthält null oder mehr Anweisungen. Er führt die aktuelle Arbeit der Funktion aus.
Beispiele
<papyrusscript>
- Eine einfache Funktion, die zwei Werte addiert und das Ergebnis zurück gibt
- Global, weil es keine self-Variable benötigt
int Function AddTwo(int a, int b) global
return a + b
endFunction
</papyrusscript>
<papyrusscript>
- Eine Funktion, die einen Wert um einen bestimmten Betrag hochzählt.
- Der Betrag hat einen voreingestellten Wert von 1 (der Aufrufer braucht es also nicht zu übergeben)
Function IncrementValue(int howMuch = 1)
myValue += howMuch
endFunction </papyrusscript>
Besondere Variablen
Es gibt zwei besondere Variablen in einer Funktion, aber nur in denen, die nicht „global“ sind. "Self" bezieht sich auf die Instanz, auf der das Script läuft und ist z.B. nützlich, wenn man sich selbst als Parameter einer anderen Funktion woanders übergeben will. "Parent" wird nur genutzt, um die Parent-Version einer Funktion aufzurufen, wenn das Parent-Script erweitert wurde.
Beispiele
<papyrusscript>
- Übergib dich selbst an eine andere Funktion
SomeObject.OtherFunction(self)
</papyrusscript>
<papyrusscript>
- Rufe die Parent-Version auf, um DoStuff zu tun. Ignoriere dabei die lokale Definition
Parent.DoStuff() </papyrusscript>
Aufruf von Funktionen
Global function:
[<identifier> '.'] <identifier> '(' [<parameters>] ')'
Non-global function:
[<expression> '.'] <identifier> '(' [<parameters>] ')'
Zum Aufruf einer Funktionen wird einfach der Identifier der Funktion benötigt, gefolgt von Klammern und den Parametern, die die Funktion benutzen soll. Der Rückgabewert der Funktion ist das Ergebnis des Funktionsaufrufs und kann einer Variable zugewiesen werden oder beim Aufruf einer anderen Funktion oder Property genutzt werden. Wenn man eine Funktion aufruft, die sich außerhalb des derzeitigen Scripts oder Scriptfragments befindet, ist zu beachten, dass keine Properties, die in dem Funktionsscipt definiert sind, gültig sind. Deshalb muss man jede Property, die man in der Funktion nutzen will, als im aufrufenden Script definierte Parameter übergeben.
Wenn man eine globale Funktion aufruft und das Script, zu dem die Funktion gehört, ist nicht das derzeitige Script oder es ist nicht importiert, dann muss man dieser Funktion den Namen des Scripts voranstellen, in dem sich die Funktion befindet. Wenn man eine nicht-globale Funktion aufruft, die einem nicht gehört, muss man dieser das Objekt voranstellen, auf dessen Funktion man zugreifen will.
Parameter
<parameters> ::= <parameter> (',' <parameter>)* <parameter> ::= [<identifier> '='] <expression>
Die Parameterliste ist eine durch Kommata getrennte Liste von Ausdrücken in der selben Reihenfolge wie sie in der Funktionsdefinition gelistet sind. Wenn ein Parameter optional ist, muss er nicht übergeben werden (der voreingestellte Wert wird vom Compiler in den Aufruf eingesetzt). Man kann Parameter außerhalb der Reihe spezifizieren, indem man dem Ausdruck den Identifier des Parameters (entsprechend dem Namen des Parameters in der Definition) voran stellt gefolgt von einem Gleichheitszeichen.
Beispiele
<papyrusscript>
- Rufe die Funktion
- MyFunction(int a, int b), nimm das Ergebnis und weise es x zu
x = MyFunction(1, 2)
</papyrusscript>
<papyrusscript>
- Rufe die Funktion DefaultFunction(float a, float b, float c = 0.0, float d = 1.0) auf MyObject auf,
- übergib aber nur die ersten drei Parameter
MyObject.DefaultFunction(4.0, 2.0, 1.0)
</papyrusscript>
<papyrusscript>
- Rufe die Funktion DefaultFunction(float a, float b, float c = 0.0, float d = 1.0) auf,
- aber spezifiziere Argument d außer der Reihe, weil c den voreingestellten Wert behalten soll
DefaultFunction(5.0, 2.4, d = 2.0)
</papyrusscript>
<papyrusscript>
- Rufe die globale Funktion MyGlobal() imUtility-Script auf
Utility.MyGlobal() </papyrusscript>
Links
- Function Reference (das englische Original des obigen Artikels)