Eines der coolen Dinge an Ruby ist, dass Sie Methoden aufrufen und Code an Stellen ausführen können, an denen andere Sprachen die Stirn runzeln würden, z. B. in Methoden- oder Klassendefinitionen.
Um beispielsweise eine Klasse zu erstellen, die bis zur Laufzeit eine unbekannte Oberklasse hat, dh zufällig ist, können Sie Folgendes tun:
class RandomSubclass < [Array, Hash, String, Fixnum, Float, TrueClass].sample
end
RandomSubclass.superclass # could output one of 6 different classes.
Dies verwendet die 1.9- Array#sample
Methode (siehe nur 1.8.7 Array#choice
), und das Beispiel ist ziemlich erfunden, aber Sie können die Leistung hier sehen.
Ein weiteres cooles Beispiel ist die Möglichkeit, nicht festgelegte Standardparameterwerte einzugeben (wie dies in anderen Sprachen häufig erforderlich ist):
def do_something_at(something, at = Time.now)
# ...
end
Das Problem mit dem ersten Beispiel ist natürlich, dass es zur Definitionszeit und nicht zur Aufrufzeit ausgewertet wird. Sobald eine Oberklasse ausgewählt wurde, bleibt diese Oberklasse für den Rest des Programms erhalten.
Im zweiten Beispiel ist do_something_at
die at
Variable jedoch bei jedem Aufruf die Zeit, zu der die Methode aufgerufen wurde (na ja, sehr, sehr nahe daran).