Crystal kennt sogenannte Steuerausdrücke. Mit ihnen steuerst du, wie das Programm abläuft, und sie nehmen einen truthy- oder falsey-Wert an. Es gibt Operatoren, mit denen du truthy- oder falsey-Werte erzeugen kannst. Man nennt sie Gleichheits- und Vergleichsoperatoren.
Es gibt zwei wichtige Steuerausdrücke, mit denen du steuerst, welcher Code ausgeführt wird und welcher nicht. Also, welcher Zweig ausgeführt wird.
Das sind if und der unless-Ausdruck.
Vergleichsoperatoren vergleichen Werte und geben true oder false zurück.
Diese Operatoren erwarten zwei Werte desselben Typs, die sie vergleichen.
Haben die Werte nicht denselben Typ, gibt der Compiler einen Fehler aus.
Hier ist eine Liste der Vergleichsoperatoren mit einem Beispiel, bei dem sie true ergeben:
| Methode | Beschreibung | Beispiel |
|---|---|---|
| < | kleiner als | 4 < 5 |
| <= | kleiner oder gleich | 4 <= 4 |
| > | größer als | 3 > 1 |
| >= | größer oder gleich | 2 >= 2 |
Gleichheitsoperatoren ähneln den Vergleichsoperatoren, aber sie prüfen, ob zwei Werte gleich sind oder nicht.
Der Operator == prüft, ob zwei Werte gleich sind, einschließlich des Typs.
Sind die Werte gleich, gibt er true zurück, andernfalls false.
Der Operator == kann jeden Typ von Wert mit jedem anderen Typ von Wert vergleichen.
Der Operator != funktioniert genauso, gibt aber true zurück, wenn die Werte nicht gleich sind, und false, wenn sie gleich sind.
Die if-Anweisung prüft, ob eine gegebene Bedingung truthy oder falsey ist.
Ist die Bedingung truthy, wird der Code innerhalb der if-Anweisung ausgeführt.
Eine if-Anweisung endet mit dem Schlüsselwort end.
if 1 == 1
puts "1 is equal to 1"
end
# => 1 is equal to 1
if 1 > 2
puts "1 is greater than 2"
end
# => no output
Die unless-Anweisung funktioniert sehr ähnlich wie die if-Anweisung, führt aber den Code innerhalb der unless-Anweisung aus, wenn die Bedingung falsey ist.
unless 1 == 1
puts "1 is not equal to 1"
end
# => no output
unless 1 > 2
puts "1 is not greater than 2"
end
# => 1 is not greater than 2
Die else-Anweisung kannst du zusammen mit if- und unless-Anweisungen verwenden.
Die else-Anweisung wird ausgeführt, wenn der if-Zweig oder der unless-Zweig nicht ausgeführt wird.
Auch wenn du einen `else`-Zweig zusammen mit `unless,` verwenden kannst, ist davon abzuraten, weil es die Lesbarkeit beeinträchtigt.
Stattdessen empfiehlt sich `if !condition` mit einem else-Zweig.
if 1 == 1
puts "1 is equal to 1"
else
puts "1 is not equal to 1"
end
# => 1 is equal to 1
unless 1 < 2
puts "1 is not greater than 2"
else
puts "1 is greater than 2"
end
# => 1 is greater than 2
Die elsif-Anweisung kannst du zusammen mit der if-Anweisung verwenden.
Die elsif-Anweisung wird ausgeführt, wenn der if-Zweig nicht ausgeführt wird und die Bedingung der elsif-Anweisung truthy ist.
Du kannst mehrere elsif-Anweisungen aneinanderreihen; die erste truthy-Bedingung wird ausgeführt.
Am Ende der if-Anweisung kann außerdem eine else-Anweisung stehen, die ausgeführt wird, wenn keine der vorherigen Anweisungen zutraf.
if 1 != 1
puts "1 is not equal to 1"
elsif 1 > 2
puts "1 is greater than 2"
else
puts "1 is not equal to 1 and 1 is not greater than 2"
end
# => 1 is not equal to 1 and 1 is not greater than 2
Wenn du einer Variablen in verschiedenen Zweigen unterschiedliche Typen zuweist, trägt sie beide Typen. Das liegt daran, dass der Compiler nicht weiß, welcher Zweig ausgeführt wird. Diese Mehrfachzuweisung, auch Union genannt, wird in späteren Konzepten erklärt. Das siehst du im folgenden Beispiel:
if 1 == 1
a = 1
else
a = "1"
end
typeof(a) # => Int32 | String
Crystal hat einen ternären Operator, eine einzeilige if-else-Anweisung: condition ? expression_if_truthy : expression_if_falsey
1 == 1 ? puts("1 is equal to 1") : puts("1 is not equal to 1")
# => 1 is equal to 1
In dieser Übung entwickeln wir ein einfaches Steuerungssystem für einen Kernreaktor.
Damit ein Reaktor Leistung erzeugt, muss er sich in einem Zustand der Kritikalität befinden. Ist der Reaktor weniger als kritisch, kann er Schaden nehmen. Geht der Reaktorzustand über die Kritikalität hinaus, kann er überlasten und eine Kernschmelze verursachen. Wir wollen die Chancen auf eine Kernschmelze verringern und den Reaktorzustand korrekt steuern.
Die folgenden drei Aufgaben drehen sich alle darum, Code für die Aufrechterhaltung eines idealen Reaktorzustands zu schreiben.
Als Erstes muss ein Steuerungssystem prüfen, ob der Reaktor in der Kritikalität ausgeglichen ist. Ein Reaktor gilt als kritisch, wenn er die folgenden Bedingungen erfüllt:
Implementiere die Methode Reactor.criticality_balanced?, die temperature in Kelvin und neutrons_emitted als Parameter entgegennimmt, und true zurückgibt, wenn die Kritikalitätsbedingungen erfüllt sind, und false, wenn nicht.
Reactor.criticality_balanced?(750, 600)
# => true
Sobald der Reaktor Leistung erzeugt, muss seine Effizienz bestimmt werden. Die Effizienz lässt sich in 4 Bereiche einteilen:
green -> Effizienz von 80% oder mehr,orange -> Effizienz unter 80%, aber mindestens 60%,red -> Effizienz unter 60%, aber noch mindestens 30%,black -> weniger als 30% effizient.Der Prozentwert lässt sich als (generated_power/theoretical_max_power)*100 berechnen, wobei generated_power = voltage * current ist.
Beachte, dass der Prozentwert normalerweise keine Ganzzahl ist. Achte also auf die richtige Verwendung der Vergleiche < und <=.
Implementiere die Methode Reactor.reactor_efficiency mit drei Parametern: voltage, current und theoretical_max_power.
Diese Funktion soll den Effizienzbereich des Reaktors zurückgeben: „green“, „orange“, „red“ oder „black“.
Reactor.reactor_efficiency(200,50,15000)
# => "orange"
In deiner letzten Aufgabe geht es darum, einen Fail-Safe-Mechanismus zu erstellen, der Überlastung und eine Kernschmelze verhindert. Dieser Mechanismus bestimmt, ob der Reaktor unter, genau auf oder über dem idealen Kritikalitätsschwellenwert liegt. Die Kritikalität lässt sich dann erhöhen, verringern oder stoppen, indem Steuerstäbe in den Reaktor eingeführt (oder aus ihm entfernt) werden.
Implementiere die Methode Reactor.fail_safe(), die 3 Parameter entgegennimmt: temperature in Kelvin, neutrons_produced_per_second und threshold, und einen Statuscode für den Reaktor ausgibt.
Wenn temperature * neutrons_produced_per_second < 90% von threshold ist, gib den Statuscode „LOW“ aus.
Das bedeutet, dass die Steuerstäbe entfernt werden müssen, damit der Reaktor Leistung erzeugt.
Wenn temperature * neutrons_produced_per_second innerhalb von plus oder minus 10% des threshold liegt, befindet sich der Reaktor in Kritikalität und es soll der Statuscode „NORMAL“ ausgegeben werden. Das bedeutet, dass der Reaktor in optimalem Zustand ist und die Steuerstäbe ideal positioniert sind.
Wenn temperature * neutrons_produced_per_second nicht in den oben genannten Bereichen liegt, steuert der Reaktor auf eine Kernschmelze zu und es muss der Statuscode „DANGER“ ausgegeben werden, um den Reaktor sofort abzuschalten.
temperature = 1000
neutrons_produced_per_second = 30
threshold = 5000
Reactor.fail_safe(temperature, neutrons_produced_per_second, threshold)
# => "DANGER"
Melde dich bei Exercism an, um Crystal mit 26 Konzepte142 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.