10.9 Lokale Variablen

Lokale Variablen können dazu verwendet werden, innerhalb einer Regel beliebige Werte zu speichern. Sie sind nur in der Regel bekannt, in der sie definiert wurden. Darin unterscheiden sie sich von globalen Variablen, die im gesamten Dialog oder Modul bekannt sind (siehe Kapitel „Globale Variablen (variables)“).

Innerhalb der Regel, in der sie definiert werden, überdecken lokale Variablen eventuell vorhandene globale Variablen mit demselben Identifikator.

Lokale Variablen können als normale Variablen oder als statische Variablen deklariert werden:

10.9.1 Normale lokale Variablen

Syntax

variable <Datentyp> <Variablenname> { := <Ausdruck> }
                [ , <Variablenname> { := <Ausdruck> } ] ;

In einer Anweisung können mehrere Variablen mit demselben Datentyp deklariert werden. Dabei sind die Identifikatoren der Variablen durch , (Komma) zu trennen.

Lokale Variablen können direkt bei der Definition mit einem Wert oder einem Ausdruck initialisiert werden. Wird ein Ausdruck zur Initialisierung verwendet, ist folgendes zu beachten:

Beispiel

rule integer R1(integer X)
{
  variable integer Z := X * 3;

  if (X > 100) then
    Z := Z / 2;
  endif

  return Z;
}

Auch eine Definition ohne direkte Initialisierung ist möglich. Hier muss aber vor dem ersten lesenden Zugriff auf die Variable ein Wert zugewiesen worden sein.

Beispiel

rule void R2 ()
{
  variable integer MyNumber;

  MyNumber := 5;

  print MyNumber;
}

Lokale Variablen können, sobald sie einen Wert enthalten, Attributen von Objekten zugewiesen werden. Es ist nur darauf zu achten, dass die Datentypen der lokalen Variablen und des Attributs dies zulassen (identische Datentypen oder Objekt-Attribut vom Typ anyvalue).

Beispiel

rule void R3 ()
{
  variable string MyWord;

  MyWord := "Hello world";
  Edittext.content := MyWord;
}

Eine Variable des Typs object kann wie ein Objekt verwendet werden, d.h. jedes Attribut des Objektes, welches in der Variablen gespeichert ist, kann verändert werden.

Beispiel

rule void R4 ()
{
  variable object MyObject;

  MyObject := MyWindow;
  MyObject.title := "New Title";
  MyObject.visible := true;
}

10.9.2 Statische Variablen (static variable)

Statische Variablen werden durch das zusätzliche Schlüsselwort static vor dem Schlüsselwort variable deklariert. Im Gegensatz zu normalen lokalen Variablen können sie nur mit Werten oder anderen Variablen initialisiert werden, aber nicht mit Ausdrücken.

Syntax

static variable <Datentyp> <Variablenname> { := <Wert> | <Variable> }
                       [ , <Variablenname> { := <Wert> | <Variable> } ] ;

Statische Variablen können von den selben Datentypen sein wie globale oder lokale Variablen.

Die Initialisierungen in den Deklarationen statischer Variablen werden nur beim ersten Regelaufruf durchgeführt, bei weiteren Aufrufen nicht mehr. Das gilt auch dann, wenn sich der Wert der Variablen, mit der initialisiert wurde, mittlerweile geändert hat. Stattdessen bleibt ihr Wert von der letzten Regelausführung bestehen.

Zur Initialisierung statischer Variablen dürfen nur Variablen verwendet werden, die vorher im Regelcode oder als globale Variablen im Dialog bzw. Modul definiert wurden.

Beispiele

variable integer G:=10;
rule Beispiel (object O input)
{
  variable boolean B;
  static variable integer X:=1, Y:=G, Z:=Y;
  static variable object  Q:=O;
  static variable boolean J:=B;
  variable integer I:=X;
}
rule Beispiel2
{
  static variable anyvalue A;
  if A = 1 then
    print "Irgendwas";
  else
    A := 1;
    print "Weitere Initalisierungen";
  endif
}