Menu
CoddyTech

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ą jest zapisywana wielkimi literami. Zdefiniowana w treści klasy może być używana po nazwie w każdej metodzie tej klasy. Poza klasą zapisujesz 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 nadają się do przechowywania niezmiennych danych używanych przez całą klasę, takich jak limity lub tablice 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"

Nie można przypisać nowego obiektu do nazwy stałej bez wyświetlenia przez Ruby ostrzeżenia, ale obiekt, który ona przechowuje, nadal można zmienić. freeze sprawia, że sam obiekt jest tylko do odczytu, więc próba zmiany powoduje wyjątek 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

Wybieraj 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ć zmienną instancji klasy:

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

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

Wyzwanie

Łatwy

Uzupełnij klasę Order. Ma 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 stawkę, zaś to_s zwraca 40.00 + 5 express = 45.00.

Dostarczony kod wypisuje free from 50, korzystając ze 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