Menu
Coddy logo textTech

Stałe

Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 14 z 57.

Stała zaczyna się wielką literą i zgodnie z konwencją zapisuje się ją wielkimi literami. Zdefiniowana w treści klasy może być używana po nazwie w każdej metodzie tej klasy. Poza klasą zapisuje się ją jako 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)

Wynik:

-100
true
false

Stałe sprawdzają się w przypadku niezmiennych danych używanych przez całą klasę, takich jak limity czy tabele wyszukiwania. Wywołanie fetch na stałej będącej hashem zgłasza KeyError dla nieznanego klucza, zamiast po cichu zwracać nil:

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

Wynik:

12
key not found: "drone"

Nazwa stałej nie może wskazywać na nowy obiekt bez wyświetlenia przez Ruby ostrzeżenia, ale obiekt, który przechowuje, nadal można zmienić. freeze sprawia, że sam obiekt jest tylko do odczytu, więc próba jego zmiany powoduje zgłoszenie FrozenError:

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?

Wynik:

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

Wybierz na podstawie tego, jak zachowuje się wartość. Wartość, która nigdy się nie zmienia, powinna być zamrożoną stałą; stan, który zmienia się podczas działania programu, na przykład licznik, powinien być klasową zmienną instancji:

class Ticket
  PREFIX = "TK"                  # stała: stała programistyczna
  @issued = 0                    # zmienna: zmienna instancyjna klasy

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

Wyzwanie

Łatwy

Uzupełnij klasę Order. Zawiera ona stałe RATES (zamrożony hash: standard kosztuje 5, express 12, pickup 0) oraz FREE_FROM (50). initialize(total, method) zgłasza ArgumentError z komunikatem unknown shipping: drone, gdy metoda nie jest kluczem w RATES. shipping zwraca 0 dla sum równych FREE_FROM lub wyższych, a w pozostałych przypadkach odpowiednią stawkę, natomiast to_s zwraca 40.00 + 5 express = 45.00.

Dostarczony kod wypisuje free from 50 przy użyciu stałej, a następnie odczytuje zamówienia w wierszach w formacie total method i wypisuje każde zamówienie lub komunikat o błędzie.

Twój kod umieść w pliku order.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

require_relative 'order'

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Ruby online