Operator-Methoden
Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 38 von 57.
Die meisten Ruby-Operatoren sind Methoden. a + b ruft a.+(b) auf, daher definiert eine Klasse + wie jede andere Methode. Arithmetik mit Wertobjekten gibt ein neues Objekt zurück und lässt beide Operanden unverändert:
class Vector
attr_reader :x, :y
def initialize(x, y)
@x = x
@y = y
end
def +(other)
Vector.new(x + other.x, y + other.y)
end
def to_s
"(#{x}, #{y})"
end
end
a = Vector.new(1, 2)
b = Vector.new(3, 4)
puts a + b
puts aAusgabe:
(4, 6)
(1, 2)Der rechte Operand kann eine andere Art von Wert sein, beispielsweise eine Zahl zum Skalieren. Das unäre Minus ist die Methode -@:
class Vector
attr_reader :x, :y
def initialize(x, y)
@x = x
@y = y
end
def -(other)
Vector.new(x - other.x, y - other.y)
end
def *(factor)
Vector.new(x * factor, y * factor)
end
def -@
Vector.new(-x, -y)
end
def to_s
"(#{x}, #{y})"
end
end
v = Vector.new(3, 4)
puts v * 2
puts v - Vector.new(1, 1)
puts(-v)Ausgabe:
(6, 8)
(2, 3)
(-3, -4)Sobald + vorhanden ist, funktioniert auch +=, denn a += b bedeutet a = a + b. sum funktioniert ebenfalls, wenn ihm ein Startwert deiner Klasse übergeben wird:
class Money
attr_reader :cents
def initialize(cents)
@cents = cents
end
def +(other)
Money.new(cents + other.cents)
end
def to_s
format("$%.2f", cents / 100.0)
end
end
total = Money.new(0)
total += Money.new(250)
total += Money.new(199)
puts total
puts [Money.new(100), Money.new(5)].sum(Money.new(0))Ausgabe:
$4.49
$1.05<=> ist ebenfalls ein Operator. Zusammen mit Comparable ermöglicht er, Money-Objekte zu vergleichen und zu sortieren, und ein Operator kann einen nicht passenden Operanden ablehnen, indem er wie bei Zahlen eine Ausnahme auslöst:
class Money
include Comparable
attr_reader :cents, :currency
def initialize(cents, currency)
@cents = cents
@currency = currency
end
def +(other)
raise ArgumentError, "cannot add #{other.currency} to #{currency}" unless other.currency == currency
Money.new(cents + other.cents, currency)
end
def <=>(other)
cents <=> other.cents
end
end
puts Money.new(500, "EUR") > Money.new(300, "EUR")
begin
Money.new(1, "EUR") + Money.new(1, "USD")
rescue ArgumentError => e
puts e.message
endAusgabe:
true
cannot add USD to EURAufgabe
EinfachVervollständige die Klasse Vector. Definiere + und - für zwei Vektoren, * für einen Vektor und eine Zahl, das unäre Minus -@, == zum Vergleichen beider Koordinaten sowie to_s, das (4, 6) zurückgibt. length gibt die Länge des Vektors mit Math.sqrt zurück.
Der bereitgestellte Code liest Ausdrücke ein: 1,2 + 3,4, 1,2 - 3,4, 1,2 * 3, neg 1,2 und 1,2 == 1,2. Er gibt jedes Ergebnis aus und bei Vektorergebnissen zusätzlich length 7.21 mit zwei Dezimalstellen.
Dein Code gehört in vector.rb. main.rb enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
require_relative 'vector'
# Gelieferter Ein-/Ausgabe-Code: belasse ihn wie er ist
input = []
while (line = gets)
input << line.chomp
end
def vec(text)
Vector.new(*text.split(",").map(&:to_i))
end
input.each do |line|
parts = line.split
result = if parts[0] == "neg" then -vec(parts[1])
else
a = vec(parts[0])
case parts[1]
when "+" then a + vec(parts[2])
when "-" then a - vec(parts[2])
when "*" then a * parts[2].to_i
else a == vec(parts[2])
end
end
puts result
puts format("length %.2f", result.length) if result.is_a?(Vector)
end
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