Потому что
three_times
является локальной переменной
- локальные переменные доступны только внутри определенной области видимости
def
в ruby создает новую область видимости
Поэтому, когда вызывается f, он не видит или не имеет доступа к three_times
Чтобы получить доступ к Three_times, измените его на глобальную переменную $three_times
или переменную экземпляра @three_times
Причина, по которой вы можете ссылаться на класс Times, заключается в том, что он является константой, а ruby проходит отдельный процесс поиска констант.
Ошибка с def
Вы также можете получить доступ к локальной переменной, используя блок для определения вашего метода, который обходит проблему с целыми областями видимости. Я делаю это иногда, когда пишу грабли, но редко делаю это вне скриптов.
three_times = Times.new(3)
define_method :foo do
three_times.each { puts 'Tests'}
end
foo