Menu
Coddy logo textTech

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
60

Bir 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ı:

7

Bir 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
Ada

Evet-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
true
challenge icon

Görev

Kolay

ShoppingCart 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?}"
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