Klassenmethoden
Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 12 von 57.
Eine Klassenmethode gehört zur Klasse, nicht zu einer Instanz. Im Klassenrumpf ist self die Klasse, daher definiert def self.name eine Methode für die Klasse. Du rufst sie direkt über die Klasse auf:
class Temperature
def self.to_fahrenheit(celsius)
celsius * 9 / 5.0 + 32
end
end
puts Temperature.to_fahrenheit(100)
puts Temperature.to_fahrenheit(-40)Ausgabe:
212.0
-40.0Klassenmethoden und Instanzmethoden befinden sich an unterschiedlichen Stellen. Eine Instanz kann eine Klassenmethode nicht direkt aufrufen; sie erreicht sie über self.class oder den Klassennamen:
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
endAusgabe:
3.14
12.57
undefined method `area_for' for an instance of Circleclass << self öffnet einen Abschnitt des Klassenkörpers, in dem jedes def eine Klassenmethode ist. Dadurch entfällt das Schreiben von self., wenn eine Klasse mehrere davon hat:
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)Ausgabe:
6.2
42.2Verwende eine Klassenmethode für Aufgaben, die zur Art des Objekts gehören und nicht zu einem einzelnen Objekt: zum Umrechnen von Einheiten, zum Parsen von Text in ein Objekt oder zum Zählen aller Instanzen. Aufgaben, die die Daten eines Objekts benötigen, bleiben eine Instanzmethode:
class Invoice
def self.tax_rate # dieselbe für jede Rechnung
0.2
end
def tax # benötigt den Betrag dieser Rechnung
@amount * Invoice.tax_rate
end
endAufgabe
EinfachVervollständige die Klassenmethoden von Temperature. to_fahrenheit(c) und to_celsius(f) konvertieren einen Wert. feel(celsius) gibt unter 0 freezing, unter 15 cold, unter 25 mild und andernfalls hot zurück. convert(text) nimmt Text wie 20 C oder 68 F entgegen und gibt 20.0 C = 68.0 F (mild) oder 68.0 F = 20.0 C (mild) zurück, mit einer Nachkommastelle und dem Gefühl des Celsius-Werts; dabei verwendet die Methode die anderen Klassenmethoden.
Der bereitgestellte Code ruft für jede Eingabezeile Temperature.convert(line) auf und gibt das Ergebnis aus. Es wird keine Instanz von Temperature erstellt.
Dein Code gehört in temperature.rb. main.rb enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
require_relative 'temperature'
# Gelieferter Ein-/Ausgabe-Code: belasse ihn wie er ist
input = []
while (line = gets)
input << line.chomp
end
input.each { |line| puts Temperature.convert(line) }
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenInstanzvariablenMethoden und selfto_s und inspectRückblick – Bibliotheksausweis4Kapselung
Private MethodenGeschützte MethodenPrivate SetterZustand schützenRückblick – Verkaufsautomat7Polymorphismus und Duck Typing
PolymorphismusDuck TypingAbstrakte MethodenFälle und KlassenRückblick – Zahlungsmethoden2Getter und Setter sowie self
Leser und SchreiberBenutzerdefinierte Setterself in MethodenIdentität und GleichheitWiederholung – Kontaktliste5Vererbung
UnterklassenMethoden überschreibensuper aufrufenis_a? und VorfahrenRückblick – Gehaltsabrechnung des Personals8Spezielle Methoden
Gleichheit und HashOperator-MethodenIndexieren und AnhängenBenutzerdefinierte CollectionsRückblick – Brüche11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihen3Klassenmethoden und Variablen
KlassenmethodenKlasseninstanzvariablenKonstantenFactory-MethodenZusammenfassung – GutscheincodesÜbe selbstständig: Online-Ruby-Compiler