Menu
Coddy logo textTech

Méthodes de classe

Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 12 sur 57.

Une méthode de classe appartient à la classe, et non à une instance. Dans le corps de la classe, self désigne la classe, donc def self.name définit une méthode sur la classe. Vous l’appelez directement sur la 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)

Sortie :

212.0
-40.0

Les méthodes de classe et les méthodes d’instance résident à des endroits différents. Une instance ne peut pas appeler directement une méthode de classe ; elle y accède via self.class ou le nom de la 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

Sortie :

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

class << self ouvre une section du corps de la classe dans laquelle chaque def est une méthode de classe. Cela évite d’écrire self. lorsqu’une classe en possède plusieurs :

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)

Sortie :

6.2
42.2

Utilisez une méthode de classe pour les opérations qui concernent le type d’objet plutôt qu’un objet particulier : convertir des unités, analyser du texte pour en faire un objet ou conserver le compte de toutes les instances. Les opérations qui nécessitent les données d’un objet restent des méthodes d’instance :

class Invoice
  def self.tax_rate      # le même pour chaque facture
    0.2
  end

  def tax                # a besoin du montant de cette facture
    @amount * Invoice.tax_rate
  end
end
challenge icon

Défi

Facile

Complète les méthodes de classe de Temperature. to_fahrenheit(c) et to_celsius(f) convertissent une valeur. feel(celsius) renvoie freezing en dessous de 0, cold en dessous de 15, mild en dessous de 25 et hot dans les autres cas. convert(text) prend un texte tel que 20 C ou 68 F et renvoie 20.0 C = 68.0 F (mild) ou 68.0 F = 20.0 C (mild), avec une décimale et la sensation correspondant à la valeur en Celsius ; elle utilise les autres méthodes de classe.

Le code fourni appelle Temperature.convert(line) pour chaque ligne d’entrée et affiche le résultat. Aucune instance de Temperature n’est créée.

Ton code doit être placé dans temperature.rb. main.rb contient le code fourni pour les entrées et les sorties et ne peut pas être modifié.

Essayez vous-même

require_relative 'temperature'

# Code d'entrée/sortie fourni : le garder tel quel
input = []
while (line = gets)
  input << line.chomp
end
input.each { |line| puts Temperature.convert(line) }
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Ruby en ligne