self in Methoden
Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 9 von 57.
Innerhalb einer Methode erzeugt name = value immer eine lokale Variable, selbst wenn die Klasse einen Setter name= hat. Um den Setter aufzurufen, schreibe den Empfänger dazu: self.name = value:
class Player
attr_accessor :level
def initialize
@level = 1
end
def broken_level_up
level = level + 1
rescue NoMethodError
puts "level is a new local variable here, still nil"
end
def level_up
self.level = level + 1
end
end
p1 = Player.new
p1.broken_level_up
p1.level_up
puts p1.levelAusgabe:
level is a new local variable here, still nil
2Leser benötigen kein self.: level und self.level rufen dieselbe Methode auf. Üblicherweise schreibt man self. nur dort, wo Ruby es benötigt, vor einem Setter:
class Rect
attr_accessor :w, :h
def initialize(w, h)
@w = w
@h = h
end
def area
w * h
end
def double!
self.w = w * 2
self.h = self.h * 2
self
end
end
puts Rect.new(2, 3).double!.areaAusgabe:
24Wenn der Setter von initialize aus mit self. aufgerufen wird, durchlaufen neue Objekte dieselbe Prüfung wie spätere Änderungen, sodass die Regel an einer einzigen Stelle festgelegt ist:
class Product
attr_reader :price
def initialize(price)
self.price = price
end
def price=(value)
raise ArgumentError, "price must be positive" if value <= 0
@price = value
end
end
puts Product.new(5).price
begin
Product.new(0)
rescue ArgumentError => e
puts e.message
endAusgabe:
5
price must be positiveWas self ist, hängt davon ab, wo der Code ausgeführt wird. Innerhalb einer Instanzmethode ist es die Instanz; im Klassenrumpf, außerhalb jeder Methode, ist es die Klasse selbst:
class Robot
puts "in the class body, self is #{self}"
def whoami
"in a method, self is a #{self.class}"
end
end
puts Robot.new.whoamiAusgabe:
in the class body, self is Robot
in a method, self is a RobotAufgabe
EinfachDie Klasse Account hat einen benutzerdefinierten Setter balance=, der bei einem Wert unter 0 ArgumentError mit balance cannot be negative auslöst. Vervollständige initialize(owner, balance), deposit(amount) und withdraw(amount), sodass jede Änderung des Kontostands über diesen Setter mit self. erfolgt, auch der Anfangskontostand.
Der bereitgestellte Code liest den Namen des Kontoinhabers und den Anfangskontostand ein, danach Befehle +n (Einzahlung) oder -n (Abhebung). Nach jedem Befehl gibt er Ada: 120 oder die Fehlermeldung und den unveränderten Kontostand aus. Bei einem ungültigen Anfangskontostand wird nur die Fehlermeldung ausgegeben.
Dein Code gehört in account.rb. main.rb enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
require_relative 'account'
# Vorgegebener Ein-/Ausgabecode: unverändert lassen
input = []
while (line = gets)
input << line.chomp
end
begin
account = Account.new(input[0], input[1].to_i)
input.drop(2).each do |cmd|
begin
amount = cmd[1..].to_i
cmd.start_with?("+") ? account.deposit(amount) : account.withdraw(amount)
rescue ArgumentError => e
puts e.message
end
puts "#{account.owner}: #{account.balance}"
end
rescue ArgumentError => e
puts e.message
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