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
War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top