Loading...
 

Crystal Funktionen

Funktionen und Methoden

Funktionen stellen kleine Programmteile dar, die nur einmal definiert werden und bei Bedarf beliebig oft aufgerufen werden können. In der objektorientierten Programmierung (OOP) werden Funktionen üblicherweise Methoden genannt.

Methodendefinition

Eine Funktion leitet man mit dem Befehl 'def' ein und beendet sie mit 'end'.

ausgabe									# die Funktion 'ausgabe' wird aufgerufen
puts "Nach dem Aufruf"					# da gehts nach dem Aufruf weiter
 
def ausgabe								# die Funktion wird definiert
  puts "Aufruf der Funktion 'ausgabe'"	# in dieser Funktion wird was ausgegeben
end										# Ende der Funktion


Ausgabe:
Aufruf der Funktion 'ausgabe'
Nach dem Aufruf

Parameterübergabe an eine Methode

An eine Methode kann man auch Parameter übergeben. Die Parameter können in runden Klammern übergeben werden oder nicht. Der Compiler behandelt beide Versionen gleich.

In der Methodendefinition wird in den Klammern der erwartete Übergabeparameter beschrieben.
'text' steht einfach für einen Variablennamen
'String' steht für den Variablentyp (hier gibt es noch einige anderen Variationen; siehe Variablen Typen)
':' vor und nach dem Doppelpunkt muss je eine 'Leerzeichen' stehen

# Parameterübergabe ohne ()
ausgabe "MASCHINFO eins"

# Parameterübergabe mit ()
ausgabe ("MASCHINFO zwei")

# Methodendefinition
def ausgabe(text : String)
  p! text
end

Ausgabe:
text # => "MASCHINFO eins"
text # => "MASCHINFO zwei"

Defaultwerte für Parameter

In der Methodendefinition kann man auch Standardwerte für die Parameter festlegen. Es ist dann möglich, die Methode ohne Angabe von Parametern aufzurufen.

# Parameterübergabe
ausgabe "MASCHINFO eins"

# ohne Parameterübergabe
ausgabe


# Methodendefinition
def ausgabe(text : String = "nix")
  p! text
end

Ausgabe:
text # => "MASCHINFO eins"
text # => "nix"

Overloading

Man spricht von Overloading, wenn es von einer Methode oder Funktion mehrere Definitionen gibt. Das ist möglich, wenn sich die Parameterübergabe an die unterschiedlichen Methoden unterscheidet.

# Parameterübergabe mit String
ausgabe "MASCHINFO eins"

# Parameterübergabe mit Int16
ausgabe 723


# Methodendefinition mit Typ String
def ausgabe(text : String)
  puts "Es wurde ein String übergeben: #{text}"
end

# Methodendefinition mit Typ Int16
def ausgabe(zahl : Int16)
  puts "Es wurde eine Zahl übergeben: #{zahl}"
end


Ausgabe:
Es wurde ein String übergeben: MASCHINFO eins
Es wurde eine Zahl übergeben: 723

Parameternamen

Damit der Code besser lesbar wird, kann es hilfreich sein, wenn man den Parametern Namen gibt. So ist es möglich, die Parameter in belibieger Reihenfolge zu übergeben.

# Parameterübergabe mit Namen
ausgabe vorname: "Lemmy", nachname: "Kilmister"

# Geht auch
ausgabe nachname: "Kilmister", vorname: "Lemmy"


# Methodendefinition unter Angabe der Parameternamen
def ausgabe(vorname : String, nachname : String)
  p! vorname
  p! nachname
end

Ausgabe:
vorname # => "Lemmy"
nachname # => "Kilmister"
vorname # => "Lemmy"
nachname # => "Kilmister"

Externe und Interne Parameternamen

Man kann innerhalb auch andere Namen verwenden.

# Parameterübergabe mit String
ausgabe vorname: "Lemmy", nachname: "Kilmister"

# Methodendefinition unter Angabe der Parameternamen
# Innerhalb der Methode wird dann mit 'vn' bzw 'nn' auf die Variablen zugegriffen
# Der Zugriff über 'vorname' ist nicht möglich
def ausgabe(vorname vn : String, nachname nn : String)
  p! vn
  p! nn
end

Ausgabe:
vn # => "Lemmy"
nn # => "Kilmister"

Parameternamen erzwingen mit '*'

Will man, dass die Methode nur mit benannten Parametern aufgerufen werden kann erreicht man das mit dem Stern '*'.

# Parameterübergabe mit Namen
ausgabe vorname: "Lemmy", nachname: "Kilmister"

# Methodendefinition unter Angabe der Parameternamen mit dem * erzwingen
def ausgabe(*, vorname : String, nachname : String)
  p! vorname
  p! nachname
end


Ausgabe:
vorname # => "Lemmy"
nachname # => "Kilmister"