Ich möchte ein Argument an eine Methode übergeben, die mit define_method definiert wird. Wie würde ich das tun?
ruby
metaprogramming
Sixty4Bit
quelle
quelle
... und wenn Sie optionale Parameter wünschen
... so viele Argumente wie Sie wollen
...Kombination von
... alle von ihnen
Aktualisieren
Ruby 2.0 hat Double Splat
**
(zwei Sterne) eingeführt, was ( ich zitiere ) Folgendes bewirkt:... und natürlich kannst du es auch in der Methode define verwenden :)
Beispiel für benannte Attribute:
Ich habe versucht, ein Beispiel mit Schlüsselwortargument, Splat und Double Splat in einem zu erstellen:
oder
... aber das wird nicht funktionieren, es sieht so aus, als gäbe es eine Einschränkung. Wenn Sie darüber nachdenken, ist dies sinnvoll, da der splat-Operator "alle verbleibenden Argumente erfasst" und double splat "alle verbleibenden Schlüsselwortargumente erfasst", sodass das Mischen dieser Argumente die erwartete Logik brechen würde. (Ich habe keinen Hinweis, um diesen Punkt zu beweisen, doh!)
Update 2018 August:
Zusammenfassender Artikel: https://blog.eq8.eu/til/metaprogramming-ruby-examples.html
quelle
a.foo 1
anstelle von seinfoo 1
). Vielen Dank!Zusätzlich zu Kevin Conners Antwort: Blockargumente unterstützen nicht dieselbe Semantik wie Methodenargumente. Sie können keine Standardargumente definieren oder Argumente blockieren.
Dies wird nur in Ruby 1.9 mit der neuen alternativen Syntax "stabby lambda" behoben, die die vollständige Semantik von Methodenargumenten unterstützt.
Beispiel:
quelle
Mit 2.2 können Sie jetzt Schlüsselwortargumente verwenden: https://robots.thoughtbot.com/ruby-2-keyword-arguments
quelle