2010-10-24 1 views

ответ

0

Нет, def не работает, как закрытие.

Чтобы sc доступны в def вы могли бы сделать его постоянным, сделать его глобальным (как правило, это плохая идея) или использовать define_method с блоком (которые затворы).

Однако, поскольку вы не находитесь внутри класса и define_method - это метод для классов (и модулей), вы не можете просто использовать его. Вы должны использовать class_eval на eigenclass sc, чтобы попасть внутрь класса.

Пример:

class <<sc; self end.class_eval 
    define_method(:should_work_closure) 
    puts some_local_var 
    end 
end 

Это будет работать, но это выглядит немного страшно. Как правило, это плохая идея для доступа к локальным переменным из окружающей области в определениях методов.

+1

в 1.9.2 вы можете просто пойти: 'sc.define_singleton_method (: should_work_closure) {ставит some_local_var} 1 – horseyguy

+0

Это выглядит страшно, но это, безусловно, не«как правило, это плохая идея, чтобы получить доступ к локальным переменным из окружающих объем в определениях методов ". Это очень обычное дело в функциональном программировании. –

+0

@JohnSalvatier Вы сравниваете яблоки с апельсинами. Ruby не имеет вложенных определений методов, поэтому, когда мы говорим о «локальных переменных из окружающей области», мы говорим о локальных переменных в глобальной области. Поэтому мы в основном говорим об изменчивости (потому что, если они не должны быть изменчивыми, они будут определяться как константы, к которым можно получить доступ из глобальных методов. Это не очень распространено в функциональном программировании. – sepp2k

Смежные вопросы