Jedną z fajnych rzeczy w Ruby jest to, że możesz wywoływać metody i uruchamiać kod w miejscach, na które inne języki by się nie podobały, na przykład w definicjach metod lub klas.
Na przykład, aby utworzyć klasę, która ma nieznaną nadklasę do czasu uruchomienia, tj. Jest losowa, możesz wykonać następujące czynności:
class RandomSubclass < [Array, Hash, String, Fixnum, Float, TrueClass].sample
end
RandomSubclass.superclass # could output one of 6 different classes.
Używa Array#sample
metody 1.9 (tylko w 1.8.7, zobacz Array#choice
), a przykład jest dość wymyślony, ale możesz zobaczyć tutaj moc.
Innym fajnym przykładem jest możliwość umieszczenia domyślnych wartości parametrów, które nie są stałe (jak często wymagają inne języki):
def do_something_at(something, at = Time.now)
# ...
end
Oczywiście problem z pierwszym przykładem polega na tym, że jest on oceniany w czasie definicji, a nie w czasie połączenia. Tak więc, po wybraniu superklasy, pozostaje nią do końca programu.
Jednak w drugim przykładzie, za każdym razem, gdy wywołasz do_something_at
, at
zmienną będzie czas wywołania metody (cóż, bardzo, bardzo blisko)