#with (object ) & блочный трюк

Существует распространенная идиома использования замен, например:

def with clazz, &block
  yield clazz
  clazz
end

with Hash.new |hash|
  hash.merge!{:a => 1}
end

Есть ли способ пойти дальше и определить #with, чтобы иметь возможность делать:

with Hash.new |hash|
  merge!{:a => 1} 
end

или даже:

with Hash.new do
  merge!{:a => 1}
end

?


ОБНОВЛЕНИЕ

Позже случайно я нашел именно то, что искал (решение, подобное принятому): http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/19153

ОБНОВЛЕНИЕ 2

Он был добавлен в сахар-высокий / dsl в https://github.com/kristianmandrup/sugar-high

ОБНОВЛЕНИЕ 3

Проект docille на Github очень хорошо использует эту идею.

7
задан Stanislav Pankevich 9 March 2014 в 17:20
поделиться