Gibt es Pläne, Ruby-Verhalten ähnlich dem CoffeeScript-Feature zu implementieren, indem Sie einen Instanzvariablennamen in einer Methodenargumentliste angeben? WieRuby: Instanzvariable automatisch als Methodenargument setzen?
class User
def initialize(@name, age)
# @name is set implicitly, but @age isn't.
# the local variable "age" will be set, just like it currently works.
end
end
Ich bin diese Frage bewusst: in Ruby can I automatically populate instance variables somehow in the initialize method?, aber alle Lösungen (einschließlich meiner eigenen) scheinen nicht die Rubin Einfachheit Philosophie zu passen.
Und, würde es irgendwelche Nachteile für dieses Verhalten geben?
UPDATE
Einer der Gründe dafür ist die DRY (nicht selbst wiederholen) Philosophie der Ruby-Community. Ich muss oft den Namen einer Argumentvariablen wiederholen, weil ich möchte, dass sie der gleichnamigen Instanzvariablen zugewiesen wird.
Ein Nachteil, den ich mir vorstellen kann ist, dass es so aussieht, als würde eine Methode nichts tun, wenn sie keinen Körper hat. Wenn Sie schnell scannen, kann dies wie ein No-Op aussehen. Aber ich denke, mit der Zeit können wir uns anpassen. Ein weiterer Nachteil: Wenn Sie andere Instanzvariablen im Körper setzen und versuchen, lesbar zu sein, indem Sie alle Zuordnungen am Anfang platzieren, kann es kognitivere "Kraft" geben, um zu sehen, dass dort auch Zuweisungen stattfinden die Argumentliste. Aber ich denke nicht, dass dies schwieriger ist, als beispielsweise einen konstanten oder Methodenaufruf zu sehen und zu seiner Definition springen zu müssen.
# notice: instance var assignments are happening in 2 places!
def initialize(@name)
@errors = []
end
Danke für diese Antwort. Es scheint definitiv mehr Arbeit zu sein als es sich lohnt. :) – hrdwdmrbl
@jackquack gut, du musst das Setup wirklich nur einmal machen. Dann müssen Sie in Ihren Klassen nur 'enable_for' und' slurp_args' aufrufen. – Kelvin