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).totalAusgabe:
35
60Innerhalb 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).countAusgabe:
7Ein 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).nameAusgabe:
Ada
AdaMethodennamen, 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
trueAufgabe
EinfachVervollstä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?}"
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenInstanzvariablenMethoden und selfto_s und inspectRückblick – Bibliotheksausweis4Kapselung
Private MethodenGeschützte MethodenPrivate SetterZustand schützenRückblick – Verkaufsautomat7Polymorphismus und Duck Typing
PolymorphismusDuck TypingAbstrakte MethodenFälle und KlassenRückblick – Zahlungsmethoden2Getter und Setter sowie self
Leser und SchreiberBenutzerdefinierte Setterself in MethodenIdentität und GleichheitWiederholung – Kontaktliste5Vererbung
UnterklassenMethoden überschreibensuper aufrufenis_a? und VorfahrenRückblick – Gehaltsabrechnung des Personals8Spezielle Methoden
Gleichheit und HashOperator-MethodenIndexieren und AnhängenBenutzerdefinierte CollectionsRückblick – Brüche11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Online-Ruby-Compiler