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
falseStał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
endWynik:
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"]
trueWybieraj 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
endWyzwanie
ŁatwyUzupeł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
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