Menu
Coddy logo textTech

Konstanten

Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 14 von 57.

Eine Konstante beginnt mit einem Großbuchstaben und wird üblicherweise in Großbuchstaben geschrieben. Wird sie im Rumpf einer Klasse definiert, kann sie in jeder Methode der Klasse über ihren Namen verwendet werden. Außerhalb der Klasse schreibst du ClassName::NAME:

class Account
  MIN_BALANCE = -100

  def self.allowed?(balance)
    balance >= MIN_BALANCE
  end
end

puts Account::MIN_BALANCE
puts Account.allowed?(-50)
puts Account.allowed?(-150)

Ausgabe:

-100
true
false

Konstanten eignen sich für unveränderliche Daten, die die gesamte Klasse verwendet, etwa Grenzwerte oder Nachschlagetabellen. fetch für eine Hash-Konstante löst bei einem unbekannten Schlüssel KeyError aus, anstatt stillschweigend nil zurückzugeben:

class Shipping
  RATES = { "standard" => 5, "express" => 12 }.freeze

  def self.cost(method)
    RATES.fetch(method)
  end
end

puts Shipping.cost("express")
begin
  Shipping.cost("drone")
rescue KeyError => e
  puts e.message
end

Ausgabe:

12
key not found: "drone"

Ein Konstantenname kann nicht auf ein neues Objekt zeigen, ohne dass Ruby eine Warnung ausgibt, aber das Objekt, auf das er verweist, kann weiterhin geändert werden. freeze macht das Objekt selbst schreibgeschützt, sodass eine Änderung FrozenError auslöst:

class Palette
  COLORS = ["red", "green"].freeze
end

begin
  Palette::COLORS << "blue"
rescue FrozenError => e
  puts e.message
end
p Palette::COLORS
p Palette::COLORS.frozen?

Ausgabe:

can't modify frozen Array: ["red", "green"]
["red", "green"]
true

Wähle danach, wie sich der Wert verhält. Ein Wert, der sich nie ändert, gehört in eine eingefrorene Konstante; ein Zustand, der sich während der Programmausführung ändert, wie etwa ein Zähler, gehört in eine Klasseninstanzvariable:

class Ticket
  PREFIX = "TK"                  # fest: eine Konstante
  @issued = 0                    # ändert sich: Klasseninstanzvariable

  def self.next_code
    @issued += 1
    "#{PREFIX}-#{@issued}"
  end
end
challenge icon

Aufgabe

Einfach

Vervollständige die Klasse Order. Sie enthält die Konstanten RATES (einen eingefrorenen Hash: standard kostet 5, express 12, pickup 0) und FREE_FROM (50). initialize(total, method) löst ArgumentError mit unknown shipping: drone aus, wenn method kein Schlüssel von RATES ist. shipping gibt für Gesamtsummen ab FREE_FROM 0 und andernfalls den entsprechenden Tarif zurück, und to_s gibt 40.00 + 5 express = 45.00 zurück.

Der bereitgestellte Code gibt mithilfe der Konstante free from 50 aus, liest anschließend Bestellungen als Zeilen im Format total method ein und gibt jede Bestellung oder die Fehlermeldung aus.

Dein Code gehört in order.rb. main.rb enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

require_relative 'order'

# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
input = []
while (line = gets)
  input << line.chomp
end
puts "free from #{Order::FREE_FROM}"
input.each do |line|
  total, method = line.split
  begin
    puts Order.new(total.to_f, method)
  rescue ArgumentError => e
    puts e.message
  end
end
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Ruby-Compiler