Metodi di classe
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 12 di 57.
Un metodo di classe appartiene alla classe, non a una singola istanza. Nel corpo della classe, self è la classe, quindi def self.name definisce un metodo sulla classe. Lo chiami direttamente sulla classe:
class Temperature
def self.to_fahrenheit(celsius)
celsius * 9 / 5.0 + 32
end
end
puts Temperature.to_fahrenheit(100)
puts Temperature.to_fahrenheit(-40)Output:
212.0
-40.0I metodi di classe e i metodi di istanza risiedono in luoghi diversi. Un'istanza non può chiamare direttamente un metodo di classe; lo raggiunge tramite self.class o il nome della classe:
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
endOutput:
3.14
12.57
undefined method `area_for' for an instance of Circleclass << self apre una sezione del corpo della classe in cui ogni def è un metodo di classe. Evita di dover scrivere self. quando una classe ne ha diversi:
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)Output:
6.2
42.2Usa un metodo di classe per il lavoro che riguarda il tipo di oggetto anziché un singolo oggetto: convertire unità, analizzare il testo per trasformarlo in un oggetto o tenere il conto di tutte le istanze. Il lavoro che richiede i dati di un singolo oggetto rimane un metodo di istanza:
class Invoice
def self.tax_rate # uguale per ogni fattura
0.2
end
def tax # richiede l'importo di questa fattura
@amount * Invoice.tax_rate
end
endSfida
FacileCompleta i metodi della classe Temperature. to_fahrenheit(c) e to_celsius(f) convertono un valore. feel(celsius) restituisce freezing sotto 0, cold sotto 15, mild sotto 25 e hot in tutti gli altri casi. convert(text) accetta testo come 20 C o 68 F e restituisce 20.0 C = 68.0 F (mild) o 68.0 F = 20.0 C (mild), con una cifra decimale e la sensazione corrispondente al valore in Celsius; usa gli altri metodi della classe.
Il codice fornito chiama Temperature.convert(line) per ogni riga di input e stampa il risultato. Non viene creata alcuna istanza di Temperature.
Il tuo codice va inserito in temperature.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
require_relative 'temperature'
# Codice di input/output fornito: lascialo così com'è
input = []
while (line = gets)
input << line.chomp
end
input.each { |line| puts Temperature.convert(line) }
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libri3Metodi e variabili di classe
Metodi di classeVariabili di istanza della classeCostantiMetodi factoryRiepilogo - Codici couponEsercitati da solo: Compilatore Ruby online