Однією із цікавих речей у рубіні є те, що ви можете викликати методи та запускати код у місцях, де інші мови нахмурилися б, наприклад, у визначеннях методу чи класу.
Наприклад, щоб створити клас, який має невідомий надклас до часу виконання, тобто випадковий, ви можете зробити наступне:
class RandomSubclass < [Array, Hash, String, Fixnum, Float, TrueClass].sample
end
RandomSubclass.superclass # could output one of 6 different classes.
Для цього використовується Array#sample
метод 1.9 (див. Лише в 1.8.7 Array#choice
), і приклад досить надуманий, але ви можете бачити потужність тут.
Ще один класний приклад - можливість встановлювати значення параметрів за замовчуванням, які не є фіксованими (як це часто вимагають інші мови):
def do_something_at(something, at = Time.now)
# ...
end
Звичайно, проблема першого прикладу полягає в тому, що він оцінюється під час визначення, а не час виклику. Отже, після обрання суперкласу він залишається таким суперкласом для решти програми.
Однак у другому прикладі кожного разу, коли ви викликаєте do_something_at
, at
змінна буде тим часом, в якому викликався метод (ну, дуже близький до нього)