Menu
Coddy logo textTech

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.0

I 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
end

Output:

3.14
12.57
undefined method `area_for' for an instance of Circle

class << 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.2

Usa 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
end
challenge icon

Sfida

Facile

Completa 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) }
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Ruby online