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
falseStał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
endWynik:
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"]
trueWybierz 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
endWyzwanie
ŁatwyUzupeł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
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasZmienne instancjiMetody i selfto_s i inspectPowtórzenie – karta biblioteczna4Hermetyzacja
Metody prywatneMetody chronionePrywatne setteryOchrona stanuPowtórzenie – automat vendingowy7Polimorfizm i typowanie kacze
PolimorfizmTypowanie kaczeMetody abstrakcyjnecase i klasyPowtórzenie – metody płatności10Wzorce projektowe, część 2
Delegowanie z ForwardableWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Metody dostępowe i self
Gettery i setteryWłasne setteryself w metodachTożsamość i równośćPowtórzenie – lista kontaktów5Dziedziczenie
PodklasyNadpisywanie metodWywoływanie superis_a? i przodkowiePowtórka – lista płac pracowników8Metody specjalne
Równość i hashMetody operatorówIndeksowanie i dodawanieWłasne kolekcjePowtórka – ułamki11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Metody i zmienne klasowe
Metody klasoweZmienne instancji klasyStałeMetody fabrykującePodsumowanie – kody kuponówPoćwicz samodzielnie: Kompilator Ruby online