【发布时间】:2011-10-30 06:31:03
【问题描述】:
有一个使用替换的常见习惯用法,例如:
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
它被添加到https://github.com/kristianmandrup/sugar-high中的sugar-high/dsl
更新 3
docille project on Github 很好地利用了这个想法。
【问题讨论】:
-
有什么用?您可以选择尽可能短的块变量。你会保存什么?顺便说一句,你错过了
do。 -
请关注问题!终于可以了吗?
-
“有一个使用替换的常见习惯用法,例如” -
[citation needed]。 -
您想要实现的最后一件事是可能的(通过 instance_eval),但它会产生一些问题:这个块将不再被视为闭包,它将被不同的绑定调用。这样的代码很容易开始变得不可读。
-
"...这个块将不再被视为闭包,它将被不同的绑定调用"。你能更详细地解释一下吗?或者举个例子......我知道 instance_eval 给出了限制,但我认为那些将使用这种 #with 方法的人理解它们。也许我忽略了什么?