Métodos de Classe
Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 12 de 57.
Um método de classe pertence à classe, não a uma instância. No corpo da classe, self é a classe, portanto def self.name define um método na classe. Você o chama na própria 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)Saída:
212.0
-40.0Métodos de classe e métodos de instância ficam em lugares diferentes. Uma instância não pode chamar um método de classe diretamente; ela o acessa por meio de self.class ou do nome da 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
endSaída:
3.14
12.57
undefined method `area_for' for an instance of Circleclass << self abre uma seção do corpo da classe na qual todo def é um método de classe. Isso evita escrever self. quando uma classe tem vários deles:
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)Saída:
6.2
42.2Use um método de classe para um trabalho que pertence ao tipo de coisa, e não a um único objeto: converter unidades, analisar texto em um objeto ou manter uma contagem de todas as instâncias. O trabalho que precisa dos dados de um objeto permanece como um método de instância:
class Invoice
def self.tax_rate # o mesmo para todas as faturas
0.2
end
def tax # precisa do valor desta fatura
@amount * Invoice.tax_rate
end
endDesafio
FácilComplete os métodos da classe Temperature. to_fahrenheit(c) e to_celsius(f) convertem um valor. feel(celsius) retorna freezing abaixo de 0, cold abaixo de 15, mild abaixo de 25 e hot caso contrário. convert(text) recebe um texto como 20 C ou 68 F e retorna 20.0 C = 68.0 F (mild) ou 68.0 F = 20.0 C (mild), com uma casa decimal e a sensação do valor em Celsius; ele usa os outros métodos da classe.
O código fornecido chama Temperature.convert(line) para cada linha de entrada e imprime o resultado. Nenhuma instância de Temperature é criada.
Seu código deve ser colocado em temperature.rb. main.rb contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
require_relative 'temperature'
# Código de entrada/saída fornecido: mantenha-o como está
input = []
while (line = gets)
input << line.chomp
end
input.each { |line| puts Temperature.convert(line) }
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação orientada a objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesVariáveis de InstânciaMétodos e selfto_s e inspectRevisão - Cartão da Biblioteca4Encapsulamento
Métodos privadosMétodos protegidosSetters privadosProtegendo o estadoRevisão - Máquina de venda automática7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMétodos Abstratoscase e ClassesRevisão - Métodos de Pagamento2Acessores e self
Leitores e GravadoresSetters Personalizadosself nos MétodosIdentidade e IgualdadeRecapitulação - Lista de Contatos5Herança
SubclassesSobrescrita de métodosChamando superis_a? e ancestraisRevisão - Folha de pagamento da equipe8Métodos Especiais
Igualdade e hashMétodos de OperadoresIndexação e AdiçãoColeções PersonalizadasRevisão - Frações11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de Livros3Métodos e Variáveis de Classe
Métodos de ClasseVariáveis de Instância da ClasseConstantesMétodos de FábricaRevisão - Códigos de CupomPratique por conta própria: Compilador de Ruby online