Одна из замечательных особенностей ruby заключается в том, что вы можете вызывать методы и выполнять код в тех местах, где другие языки будут недовольны, например, в определениях методов или классов.
Например, чтобы создать класс, который имеет неизвестный суперкласс до времени выполнения, т.е. является случайным, вы можете сделать следующее:
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
переменная будет время , что метод был назван (ну, очень и очень близко к нему)