Metotlar ve self
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 4 / 57.
Bir yöntem, alıcı belirtmeden aynı nesnenin başka bir yöntemini çağırabilir. Ruby çağrıyı mevcut nesneye gönderir; böylece yöntemler birbirinin üzerine inşa edilir:
class Order
def initialize(price, quantity)
@price = price
@quantity = quantity
end
def subtotal
@price * @quantity
end
def shipping
subtotal >= 50 ? 0 : 5
end
def total
subtotal + shipping
end
end
puts Order.new(10, 3).total
puts Order.new(20, 3).totalÇıktı:
35
60Bir yöntem içinde self, yöntemin çağrıldığı nesnedir. self döndüren bir yöntem, çağıranın aynı nesne üzerinde birkaç çağrıyı zincirlemesine olanak tanır:
class Counter
def initialize
@count = 0
end
def add(n)
@count += n
self
end
def count
@count
end
end
puts Counter.new.add(2).add(5).countÇıktı:
7Bir nesne, örneğin aynı sınıftaki başka bir nesneyle yapılan karşılaştırmanın kazananını döndürmek için self ile kendisini başka bir koda da aktarabilir:
class Player
def initialize(name, score)
@name = name
@score = score
end
def name
@name
end
def score
@score
end
def winner_against(other)
score >= other.score ? self : other
end
end
ada = Player.new("Ada", 9)
bo = Player.new("Bo", 7)
puts ada.winner_against(bo).name
puts bo.winner_against(ada).nameÇıktı:
Ada
AdaEvet-hayır sorusuna yanıt veren metot adları ? ile biter; örneğin empty?. Parametrelerin, çağıran taraf bağımsız değişkeni belirtmediğinde kullanılan varsayılan değerleri olabilir:
class Kettle
def initialize
@temp = 20
end
def hot?
@temp >= 90
end
def heat(degrees = 10)
@temp = [@temp + degrees, 100].min
end
end
k = Kettle.new
k.heat
puts k.hot?
k.heat(75)
puts k.hot?Çıktı:
false
trueGörev
KolayShoppingCart sınıfını tamamla. add(name, price) bir öğeyi saklar ve sepetin kendisini döndürür; böylece çağrılar zincirlenebilir. total fiyatların toplamını döndürür, free_shipping? toplam 20 veya daha fazla olduğunda true döndürür ve summary iki ondalık basamakla 3 items, total 12.50 (veya 1 item, total 4.00) döndürür.
Sağlanan kod, çağrıları zincirleyerek her girdi satırı (name price) için bir öğe ekler, ardından summary ve free shipping: true veya free shipping: false yazdırır.
Kodun shopping_cart.rb dosyasına yazılmalıdır. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'shopping_cart'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input = []
while (line = gets)
input << line.chomp
end
cart = input.reduce(ShoppingCart.new) do |c, line|
name, price = line.split
c.add(name, price.to_f)
end
puts cart.summary
puts "free shipping: #{cart.free_shipping?}"
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
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıf TanımlamaÖrnek DeğişkenleriMetotlar ve selfto_s ve inspectÖzet - Kütüphane Kartı7Çok Biçimlilik ve Ördek Tiplemesi
Çok BiçimlilikÖrdek TiplemesiSoyut Metotlarcase ve SınıflarTekrar - Ödeme Yöntemleri2Erişimciler ve self
Okuyucular ve YazıcılarÖzel Setter'larMetotlarda selfKimlik ve EşitlikTekrar - Kişi Listesi5Kalıtım
Alt sınıflarMetotları geçersiz kılmasuper çağrısıis_a? ve üst sınıflarTekrar - Personel Maaşları8Özel Metotlar
Eşitlik ve hashOperatör Metotlarıİndeksleme ve EklemeÖzel KoleksiyonlarTekrar - Kesirler11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç Alma3Sınıf Metotları ve Değişkenleri
Sınıf MetotlarıSınıf Örnek DeğişkenleriSabitlerFabrika MetotlarıTekrar - Kupon KodlarıKendi başına pratik yap: Online Ruby derleyicisi