有一个常见的习惯用法,比如:
def with clazz, &block
yield clazz
clazz
end
with Hash.new |hash|
hash.merge!{:a => 1}
end
Run Code Online (Sandbox Code Playgroud)
有没有办法进一步定义#with有可能做到:
with Hash.new |hash|
merge!{:a => 1}
end
Run Code Online (Sandbox Code Playgroud)
甚至:
with Hash.new do
merge!{:a => 1}
end
Run Code Online (Sandbox Code Playgroud)
?
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
Github上的docille项目很好地利用了这个想法.
如果你指的是Rails路由的方式,那么我认为你需要做这样的事情
def with(instance, &block)
instance.instance_eval(&block)
instance
end
with(Hash.new) do
merge!({:a => 1})
merge!({:b => 1})
end
Run Code Online (Sandbox Code Playgroud)
通过查看action_pack/lib/action_dispatch/routing/route_set中的draw方法,我就可以看到它在Rails源代码中的完成情况了.