Menu
CoddyTech

Methoden und self

Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 4 von 57.

Eine Methode kann eine andere Methode desselben Objekts aufrufen, ohne einen Empfänger anzugeben. Ruby sendet den Aufruf an das aktuelle Objekt, sodass Methoden aufeinander aufbauen:

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

Ausgabe:

35
60

Innerhalb einer Methode ist self das Objekt, auf dem die Methode aufgerufen wurde. Eine Methode, die self zurückgibt, ermöglicht es dem Aufrufer, mehrere Aufrufe desselben Objekts zu verketten:

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

Ausgabe:

7

Ein Objekt kann sich mit self auch an anderen Code übergeben, zum Beispiel, um den Gewinner eines Vergleichs mit einem anderen Objekt derselben Klasse zurückzugeben:

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

Ausgabe:

Ada
Ada

Methodennamen, die eine Ja-oder-Nein-Frage beantworten, enden mit ?, wie etwa empty?. Parameter können Standardwerte haben, die verwendet werden, wenn der Aufrufer das Argument weglässt:

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?

Ausgabe:

false
true
challenge icon

Aufgabe

Einfach

Vervollständige die Klasse ShoppingCart. add(name, price) speichert einen Artikel und gibt den Warenkorb selbst zurück, sodass die Aufrufe verkettet werden können. total gibt die Summe der Preise zurück, free_shipping? gibt ab einer Gesamtsumme von 20 true zurück und summary gibt 3 items, total 12.50 (oder 1 item, total 4.00) mit zwei Dezimalstellen zurück.

Der bereitgestellte Code fügt pro Eingabezeile (name price) durch Verkettung der Aufrufe einen Artikel hinzu und gibt anschließend summary sowie free shipping: true oder free shipping: false aus.

Dein Code gehört in shopping_cart.rb. main.rb enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

require_relative 'shopping_cart'

# Vorgegebener Ein-/Ausgabecode: unverändert lassen
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Ruby-Compiler