Una delle cose più belle di ruby è che puoi chiamare metodi ed eseguire codice in luoghi in cui altre lingue potrebbero essere disapprovate, come nelle definizioni di metodi o classi.
Ad esempio, per creare una classe che ha una superclasse sconosciuta fino al runtime, ovvero è casuale, è possibile effettuare le seguenti operazioni:
class RandomSubclass < [Array, Hash, String, Fixnum, Float, TrueClass].sample
end
RandomSubclass.superclass # could output one of 6 different classes.
Questo utilizza il Array#sample
metodo 1.9 (solo in 1.8.7, vediArray#choice
), e l'esempio è abbastanza elaborato ma puoi vedere il potere qui.
Un altro esempio interessante è la possibilità di inserire valori di parametri predefiniti non fissi (come spesso richiedono altre lingue):
def do_something_at(something, at = Time.now)
# ...
end
Naturalmente il problema con il primo esempio è che viene valutato al momento della definizione, non al momento della chiamata. Quindi, una volta che una superclasse è stata scelta, rimane quella superclasse per il resto del programma.
Tuttavia, nel secondo esempio, ogni volta che chiami do_something_at
, la at
variabile sarà l'ora in cui è stato chiamato il metodo (beh, molto molto vicino ad esso)