Menu
Coddy logo textTech

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 für dasselbe Objekt 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 anderem 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 ein Element 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 Summe 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) ein Element hinzu, indem die Aufrufe verkettet werden, 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 Eingabe-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

require_relative 'shopping_cart'

# Mitgelieferter Ein-/Ausgabecode: belasse ihn wie er ist
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