Menu
Coddy logo textTech

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

Mé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
end

Saída:

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

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

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

Desafio

Fácil

Complete 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) }
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de Ruby online