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.0Los 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
endSalida:
3.14
12.57
undefined method `area_for' for an instance of Circleclass << 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.2Usa 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
endDesafío
FácilCompleta 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) }
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
1Clases y objetos
Trabajar con archivosDefinir clasesVariables de instanciaMétodos y selfto_s e inspectRepaso: tarjeta de biblioteca4Encapsulación
Métodos privadosMétodos protegidosAsignadores privadosProtección del estadoRepaso: máquina expendedora7Polimorfismo y tipado pato
PolimorfismoTipado patoMétodos abstractoscase y clasesRepaso: métodos de pago2Accesores y self
Lectores y escritoresSetters personalizadosself en los métodosIdentidad e igualdadRepaso: lista de contactos5Herencia
SubclasesSobrescritura de métodosLlamar a superis_a? y ancestrosRepaso - Nómina del personal8Métodos especiales
Igualdad y hashMétodos de operadoresIndexación y adiciónColecciones personalizadasRepaso: fracciones11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de libros3Métodos y variables de clase
Métodos de claseVariables de instancia de claseConstantesMétodos de fábricaRepaso: códigos de cupónPractica por tu cuenta: Compilador de Ruby online