ruby – #with(对象)和块技巧

一个常见的习惯用法,比如:
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

UPDATE

后来我偶然发现了我正在寻找的东西(解决方案类似于已接受的解决方案):
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/19153

更新2

它在https://github.com/kristianmandrup/sugar-high年被添加到sugar-high / dsl中

更新3

docille project on Github很好地利用了这个想法.

解决方法

如果你指的是Rails路由的方式,那么我认为你需要做这样的事情
def with(instance,&block)
  instance.instance_eval(&block)
  instance
end

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

通过查看action_pack/lib/action_dispatch/routing/route_set中的draw方法,我就可以看到它在Rails源代码中的完成情况

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...