元编程这本书 3.7 小节中,使用块作为块的参数并且将其作为 Proc 对象使用。 Kernel.send :define_method, :event do |name, &block| events[name] = block end 但这显然行不通,会出现“stack level too deep (SystemStackError)”的错误,如果是运行块倒好办,直接用 yield 就行了。只是这里要用作对象,怎么弄呢? 盼指教!
Kernel.send :define_method, :event do |name, &block|
events[name] = block
end
Kernel.send :define_method,:foo ,&Proc.new{|bar| bar * 2} 块!=Proc
Kernel.send :define_method,:foo ,&Proc.new{|bar| bar * 2}
#1 楼 @jjym 对啊,块!=Proc,才导致需要在参数前加&符号。 但现在是需要用块作为 block 的参数,do |name, &block|里 block 是一个块参数,通过&符号将其转变成是一个 Proc 对象,只是语言不允许这么做,两根竖线中间的参数不能加&,我想了解一下看过《元编程》的牛人是怎么解决这个问题的?
do |name, &block|
#2 楼 @adventurelw 看错了,不过我试了下没这错误。 只是语言不允许这么做,两根竖线中间的参数不能加& 为什么这么说?不要武断的得出结论啊
#3 楼 @jjym 咦,那真是奇怪,我是在 1.9.3p194 下,请问的你环境是? 我肯定是运行了有错误才来问的。
示例代码没有问题。
#5 楼 @zw963 请问运行环境是? 我在 1.9.3p194 下就出现了这个问题啊。。。。
嗯,重新测试了一下,应该是我哪里有点搞错了,语法是没有问题的,多谢。