Menu
Coddy logo textTech

Metody klasowe

Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 12 z 57.

Metoda klasowa należy do klasy, a nie do jednej instancji. W treści klasy self oznacza klasę, więc def self.name definiuje metodę klasy. Wywołujesz ją na samej klasie:

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

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

Wynik:

212.0
-40.0

Metody klasowe i metody instancji znajdują się w różnych miejscach. Instancja nie może bezpośrednio wywołać metody klasowej; uzyskuje do niej dostęp przez self.class lub nazwę klasy:

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

Wynik:

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

class << self otwiera sekcję treści klasy, w której każda metoda def jest metodą klasową. Pozwala uniknąć pisania self., gdy klasa ma ich kilka:

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)

Wynik:

6.2
42.2

Użyj metody klasowej do zadań, które dotyczą danego rodzaju obiektów, a nie pojedynczego obiektu: przeliczania jednostek, przekształcania tekstu w obiekt lub zliczania wszystkich instancji. Zadanie, które wymaga danych jednego obiektu, powinno być realizowane przez metodę instancji:

class Invoice
  def self.tax_rate      # taka sama dla każdej faktury
    0.2
  end

  def tax                # potrzebuje kwoty tej faktury
    @amount * Invoice.tax_rate
  end
end
challenge icon

Wyzwanie

Łatwy

Uzupełnij metody klasy Temperature. to_fahrenheit(c) i to_celsius(f) przeliczają wartość. feel(celsius) zwraca freezing dla wartości poniżej 0, cold poniżej 15, mild poniżej 25, a w pozostałych przypadkach hot. convert(text) przyjmuje tekst, taki jak 20 C lub 68 F, i zwraca 20.0 C = 68.0 F (mild) lub 68.0 F = 20.0 C (mild), z jednym miejscem po przecinku i określeniem odczuwalnej temperatury dla wartości w stopniach Celsjusza; korzysta z pozostałych metod klasy.

Dostarczony kod wywołuje Temperature.convert(line) dla każdej linii wejściowej i wyświetla wynik. Nie jest tworzona żadna instancja Temperature.

Twój kod umieść w pliku temperature.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

require_relative 'temperature'

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input = []
while (line = gets)
  input << line.chomp
end
input.each { |line| puts Temperature.convert(line) }
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Ruby online