Loading...
 

Variablen und deren Basistypen (Literals)


Variablen sind dazu da, Informationen zu speichern.

In Variablen kann man in einfachsten Fall Zahlen oder Text speichern.

Deklaration, Definition, Initialisierung und Zuweisung

Bei der Deklaration wird der Variablenname und dessen Typ festgelegt. Bei Crystal muss dern Typ allerdings nicht zwingend angegeben werden. Der Compiler versucht beim compilieren, den "richtigen" Typ herauszufinden. Gelingt das nicht oder gibt es widersprüchliche Zuweisungen, kommt es zum Fehler. Der Typ gibt Auskunft, wie die Daten im Speicher zu interpretieren sind.

Die Definition reserviert den erforderlichen Speicherplatz für die Variable.

Bei der Initialisierung wird der Variablen ein Anfangsert zugewiesen.

Eine Zuweisung kann während Laufzeit durchgeführt werden und ändert den Wert einer Variablen.


In Crystal wird es dem Programmierer weitgehend frei überlassen, wie wie strikt er bereits bei der Deklaration an einen Datentypen halten will. So mancher C-Experte wird jetzt die Hände über den Kopf zusammenschlagen. Crystal geht nach der Devise, dass man kann aber nicht muss. Allerdings kann nicht jeder diese Freiheit aushalten!

Beispiel:

# Die Variable 'zahl': 
# - wird als positive Ganzzahl deklariert, 
# - es werden 2 Byte Speicherplatz reseriert
# - wird mit 37 belegt
zahl = 37_u16

# schriebe man
zahl = 37
# wird die 37 als Int32 interpretiert


Vorabbeispiele

Hallo MASCHINFO

text = "Hallo MASCHINFO"	# der Variable 'text' wird mit '=' der String 'Hallo MASCHINFO' zugewiesen

puts text					# gibt die Variable 'text' aus
p! text						# gibt zusätzliche Informationen zur Variable mit aus


Ausgabe:
Hallo MASCHINFO
text # => "Hallo MASCHINFO"


Kommentare werden mit dem Nummerzeichen, Lattenzaun oder neuderings aus Hashtag '#' eingeleitet. Alles was dahinter steht wird vom Compiler ignoriert.

Der Variablenname muß mit einem Kleinbuchstaben oder Unterstrich (_) beginnen und sollte in snake_case geschrieben werden. Ansonsten können beliebige alphanumerische Ausrücke verwendet werden.

Ausgabe mit Variablen

text = "Hallo MASCHINFO"
zahl = 7

p! text
p! zahl

puts "Variable ist: #{zahl}"	# In den Ausgabestring wird eine Variable mit eingebunden


Ausgabe:
text # => "Hallo MASCHINFO"
zahl # => 7
Variable ist: 7


Rechnen mit Variablen

preis = 7
anzahl = 3

ergebnis = preis * anzahl

p! ergebnis

Ausgabe:
ergebnis # => 21


Typen

Nil

'nil' bedeutet, dass eine Wert nicht gesetzt ist. In anderen Programmiersprachen gerne als 'null' bezeichnet.

# Array mit Index 0, 1, 2
arr = [7, 12, 3]

# Wenn es den Index 2 nicht gibt
if arr[2]? == nil 
	puts "Index 2 ist nicht vorhanden."
end

# Wenn es den Index 3 nicht gibt
if arr[3]? == nil 
	puts "Index 3 ist nicht vorhanden."
end


Ausgabe:
Index 3 ist nicht vorhanden.


Bool

'bool' kann nur 'true' oder 'false' annehmen.

# behauptung darf nur wahr (true) oder falsch (false) seind
behauptung : Bool
 
# wir vergleichen zwei Zahlen miteinander
behauptung = (1 == 2)
 
# das Ergebnis vom Vergleich wird ausgegeben
if behauptung == true 
	puts "behauptung ist richtig"
else
	puts "behauptung ist falsch"
end


Ausgabe:
behauptung ist falsch


Integers

Als Interger werden werden ganze Zahlen bezeichnet. Genauere Infos sind unter Zahlen zu finden.
43_int32, 11_u8

Floats

Floats benutzt man für krumme Zahlen.
3.14_f64, 27.8834_f32

Char

Als Char werden einzelen Zeichen bezeichnet.
'a'

String

Strings sind Zeichen ketten. Weiter Infos gibts unter Strings.
"Servus"

Symbol

:symbol

Array

Eine indexbasierte Variable. Ausführliche Infos gibts unter Arrays.
[1, 2, 7, 9]

Array-like

{1, 3, 9,10}

Hash

Auslistung im Key=>Value Stil.

# Hash deklarieren
lieferanten = Hash(String, Float64)

# Hash erstellen
lieferanten = {"dpd" => 5.5, "dhl" => 4.9, "post" => 3.7}

# Der Werte eines Elements kann geändert werden
lieferanten["dhl"] = 8.0

# Zugriff auf einzelne Elemente
p! lieferanten["dpd"]
p! lieferanten["dhl"]

Ausgabe:
lieferanten["dpd"] # => 5.5
lieferanten["dhl"] # => 8.0


Hash-like

{"rot" => 12, "gruen" = 10}

Range

Gibt einen Zahlenbereich zwischen zwei Werten an.
'..' zwei Punkte schliessen die beiden angegeben Wert ein.
'...' drei Punkte schliessen nur den ersten Wert ein.

# Anlegen von Range Variablen
reihe_eins = 1..3
reihe_zwei = 1...3

# Schleife mit allen Zahlen
reihe_eins.each do |zahl|
  p! zahl
end
puts "---"

# Schleife mit allen Zahlen
reihe_zwei.each do |zahl|
  p! zahl
end


Ausgabe:
zahl # => 1
zahl # => 2
zahl # => 3
---
zahl # => 1
zahl # => 2


Regex

Reguläre Ausdrücke. Dazu wird es eine separate Seite geben.

Tuple

Eine indexbasierte Variable.

NamedTuple

Auflistung nach dem Key=>Value Stil. Die Daten werden auf dem Stack gespeichert und sind nicht änderbar.

# Named Tuple erstellen mit {} Klammern
lieferanten = {dpd: 5.5, dhl: 4.9, gls: 7.4, "post": 3.7}

# Der Zugriff auf einzelen Elemente erfolgt so
p! lieferanten[:dhl]
p! lieferanten["post"]
p! lieferanten[:post]
p! lieferanten["gls"]


Ausgabe:
lieferanten[:dhl] # => 4.9
lieferanten["post"] # => 3.7
lieferanten[:post] # => 3.7
lieferanten["gls"] # => 7.4



Wer sich die geschweiften Klammer sparen will, kann das Tuple auch mit NamedTuple.new erstellen:

# Named Tuple erstellen mit NamedTuple.new
lieferanten = NamedTuple.new(dpd: 5.5, dhl: 4.9, gls: 7.4, "post": 3.7)

# Der Zugriff auf einzelen Elemente erfolgt so
p! lieferanten[:dhl]


Ausgabe:
lieferanten[:dhl] # => 4.9


Proc

Funktionspointer

Command

Ausführung von Shell Kommandos

Typ von Variablen feststellen mit typeof

Den Type einer Variablen kann mit typeof feststellen:

# NamedTuple
var1 = {dpd: 5.5, dhl: 4.9, gls: 7.4, "post": 3.7}

# gibt den Typ von var1 aus
p! typeof(var1)


Ausgabe:
typeof(var1) # => NamedTuple(dpd: Float64, dhl: Float64, gls: Float64, post: Float64)