Menu
Coddy logo textTech

Métodos de clase

Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 12 de 57.

Un método de clase pertenece a la clase, no a una instancia. En el cuerpo de la clase, self es la clase, por lo que def self.name define un método en la clase. Lo llamas en la propia clase:

class Temperature
  def self.to_fahrenheit(celsius)
    celsius * 9 / 5.0 + 32
  end
end

puts Temperature.to_fahrenheit(100)
puts Temperature.to_fahrenheit(-40)

Salida:

212.0
-40.0

Los métodos de clase y los métodos de instancia se encuentran en lugares diferentes. Una instancia no puede llamar directamente a un método de clase; accede a él mediante self.class o el nombre de la clase:

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

Salida:

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

class << self abre una sección del cuerpo de la clase en la que cada def es un método de clase. Evita tener que escribir self. cuando una clase tiene varios:

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)

Salida:

6.2
42.2

Usa un método de clase para el trabajo que pertenece al tipo de objeto en lugar de a un objeto concreto: convertir unidades, analizar texto para convertirlo en un objeto o llevar un recuento de todas las instancias. El trabajo que necesita los datos de un objeto debe permanecer en un método de instancia:

class Invoice
  def self.tax_rate      # el mismo para cada factura
    0.2
  end

  def tax                # necesita el importe de esta factura
    @amount * Invoice.tax_rate
  end
end
challenge icon

Desafío

Fácil

Completa los métodos de clase de Temperature. to_fahrenheit(c) y to_celsius(f) convierten un valor. feel(celsius) devuelve freezing por debajo de 0, cold por debajo de 15, mild por debajo de 25 y hot en cualquier otro caso. convert(text) recibe texto como 20 C o 68 F y devuelve 20.0 C = 68.0 F (mild) o 68.0 F = 20.0 C (mild), con un decimal y la sensación térmica del valor Celsius; utiliza los otros métodos de clase.

El código proporcionado llama a Temperature.convert(line) para cada línea de entrada e imprime el resultado. No se crea ninguna instancia de Temperature.

Tu código debe estar en temperature.rb. main.rb contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

require_relative 'temperature'

# Código de entrada/salida suministrado: déjalo tal como está
input = []
while (line = gets)
  input << line.chomp
end
input.each { |line| puts Temperature.convert(line) }
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de Ruby online