Wie funktioniert dieser Ruby Custom Accessor?
-
14-10-2019 - |
Frage
Die nachstehende Methode in class_eval erstellt also dynamisch Zubehör für Attribute, die zur Laufzeit definiert wurden. Es kann beispielsweise verwendet werden, um Konfigurationsobjekte mit Attributen zu erstellen, die aus einer Konfigurationsdatei (und bis zur Laufzeit) gelesen werden. Ich verstehe alles außer dem anderen Zweig. Wenn ich korrekt bin, gibt der sonst der Zweig den Attributwert zurück (Val [0]), wenn ein Wert in *val übergeben wird. Die Art und Weise, wie ich geschrieben habe, würde ich erwarten, dass es ein Array (Val) zurückgibt, wenn mehr als ein Wert in *var übergeben wird. Insbesondere, wenn ich so etwas wie folgt habe:
value = 5
Dann würde ich vom Lesen des Codes erwarten @value to be [=,5]
. Jedoch @value
Gibt 5 und nicht das Array [=, 5] zurück. Wie ist das möglich?
class Module
def dsl_accessor(*symbols)
symbols.each do |sym|
class_eval %{
def #{sym}(*val)
if val.empty?
@#{sym}
else
@#{sym} = val.size == 1 ? val[0] : val
end
end
}
end
end
end
Lösung
Das gleiche Zeichen ist kein Argument für die Methode, sondern Teil des Method -Namens. Eigentlich können Sie eine solche Aufgabe aufrufen:
value=(5)
Nur Ganzzahl 5 ist ein Argument für die Funktion
*Aktualisieren
class Module
def dsl_accessor(*symbols)
symbols.each do |sym|
class_eval %{
def #{sym}
@#{sym}
end
def #{sym}=(val)
@#{sym} = val
end
}
end
end
end