Ruby 1.9 дает возможность определять переменные, которые являются локальными для блока и не закрываются по переменным с тем же именем во внешней области видимости:
x = 10
proc { |;x|
x = 20
}.call
x #=> 10
Я бы хотел использовать это поведение по умолчанию для некоторых блоков, которые я определяю - без необходимости использовать |; x, y, z | синтаксис (обратите внимание на точку с запятой).
Я не думаю, что Ruby позволяет это изначально, но возможно ли взломать эту функцию?
В настоящее время у меня есть одно решение, но оно довольно уродливо, так как требует проверки, какие локальные объекты изменились в конце блока, а затем возвращает их к их значениям до блока. Я не против, если ваше решение требует указать, какие переменные являются локальными в начале блока, т.е. scope(:x) { x = 20 }