Menu
Coddy logo textTech

Sınıf Metotları

Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 12 / 57.

Bir sınıf yöntemi tek bir örneğe değil, sınıfa aittir. Sınıf gövdesinde self sınıftır; bu nedenle def self.name sınıf üzerinde bir yöntem tanımlar. Bu yöntemi doğrudan sınıf üzerinde çağırırsın:

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

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

Çıktı:

212.0
-40.0

Sınıf metotları ve örnek metotları farklı yerlerde bulunur. Bir örnek, bir sınıf metodunu doğrudan çağıramaz; ona self.class veya sınıf adı üzerinden ulaşır:

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

Çıktı:

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

class << self, sınıf gövdesinin her def ifadesinin bir sınıf yöntemi olduğu bir bölümünü açar. Bir sınıfın birden fazla sınıf yöntemi olduğunda self. yazma gereksinimini ortadan kaldırır:

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)

Çıktı:

6.2
42.2

Bir nesneye değil, bir şeyin türüne ait olan işler için sınıf yöntemi kullanın: birimleri dönüştürmek, metni bir nesneye ayrıştırmak veya tüm örneklerin sayısını tutmak gibi. Bir nesnenin verilerine ihtiyaç duyan işler ise örnek yöntemi olarak kalır:

class Invoice
  def self.tax_rate      # her fatura için aynı
    0.2
  end

  def tax                # bu faturanın tutarına ihtiyaç duyar
    @amount * Invoice.tax_rate
  end
end
challenge icon

Görev

Kolay

Temperature sınıfının metotlarını tamamla. to_fahrenheit(c) ve to_celsius(f) bir değeri dönüştürür. feel(celsius), 0'ın altında freezing, 15'in altında cold, 25'in altında mild ve diğer durumlarda hot döndürür. convert(text), 20 C veya 68 F gibi bir metin alır ve bir ondalık basamakla, Celsius değerinin hissedilen sıcaklığıyla birlikte 20.0 C = 68.0 F (mild) veya 68.0 F = 20.0 C (mild) döndürür; diğer sınıf metotlarını kullanır.

Sağlanan kod, her giriş satırı için Temperature.convert(line) çağrısını yapar ve sonucu yazdırır. Hiçbir Temperature örneği oluşturulmaz.

Kodun temperature.rb dosyasına yazılmalıdır. main.rb sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.

Kendin dene

require_relative 'temperature'

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input = []
while (line = gets)
  input << line.chomp
end
input.each { |line| puts Temperature.convert(line) }
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Ruby derleyicisi