Metody klasowe
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 12 z 57.
Metoda klasowa należy do klasy, a nie do jednej instancji. W treści klasy self oznacza klasę, więc def self.name definiuje metodę klasy. Wywołujesz ją na samej klasie:
class Temperature
def self.to_fahrenheit(celsius)
celsius * 9 / 5.0 + 32
end
end
puts Temperature.to_fahrenheit(100)
puts Temperature.to_fahrenheit(-40)Wynik:
212.0
-40.0Metody klasowe i metody instancji znajdują się w różnych miejscach. Instancja nie może bezpośrednio wywołać metody klasowej; uzyskuje do niej dostęp przez self.class lub nazwę klasy:
class Circle
def self.area_for(r)
(3.14159 * r * r).round(2)
end
def initialize(r)
@r = r
end
def area
self.class.area_for(@r)
end
end
puts Circle.area_for(1)
puts Circle.new(2).area
begin
Circle.new(2).area_for(2)
rescue NoMethodError => e
puts e.message
endWynik:
3.14
12.57
undefined method `area_for' for an instance of Circleclass << self otwiera sekcję treści klasy, w której każda metoda def jest metodą klasową. Pozwala uniknąć pisania self., gdy klasa ma ich kilka:
class Units
class << self
def km_to_miles(km)
(km * 0.621371).round(1)
end
def miles_to_km(miles)
(miles / 0.621371).round(1)
end
end
end
puts Units.km_to_miles(10)
puts Units.miles_to_km(26.2)Wynik:
6.2
42.2Użyj metody klasowej do zadań, które dotyczą danego rodzaju obiektów, a nie pojedynczego obiektu: przeliczania jednostek, przekształcania tekstu w obiekt lub zliczania wszystkich instancji. Zadanie, które wymaga danych jednego obiektu, powinno być realizowane przez metodę instancji:
class Invoice
def self.tax_rate # taka sama dla każdej faktury
0.2
end
def tax # potrzebuje kwoty tej faktury
@amount * Invoice.tax_rate
end
endWyzwanie
ŁatwyUzupełnij metody klasy Temperature. to_fahrenheit(c) i to_celsius(f) przeliczają wartość. feel(celsius) zwraca freezing dla wartości poniżej 0, cold poniżej 15, mild poniżej 25, a w pozostałych przypadkach hot. convert(text) przyjmuje tekst, taki jak 20 C lub 68 F, i zwraca 20.0 C = 68.0 F (mild) lub 68.0 F = 20.0 C (mild), z jednym miejscem po przecinku i określeniem odczuwalnej temperatury dla wartości w stopniach Celsjusza; korzysta z pozostałych metod klasy.
Dostarczony kod wywołuje Temperature.convert(line) dla każdej linii wejściowej i wyświetla wynik. Nie jest tworzona żadna instancja Temperature.
Twój kod umieść w pliku temperature.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'temperature'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input = []
while (line = gets)
input << line.chomp
end
input.each { |line| puts Temperature.convert(line) }
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