有一个常见的习惯用法,比如:
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源代码中的完成情况
原文地址:https://www.jb51.cc/ruby/268296.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。