- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我需要允许在类的范围内定义和调用 block ,使用 instance_exec
(通过 Rails 2.3.2)。然而,在某些情况下,其中一些 block 需要提前返回,这给我带来了问题。
我的应用程序是使用 ruby 1.8.6 构建的,但我也需要让它在 1.8.7 上运行。似乎在这两个版本之间,从 lambda 中返回的能力被删除了。以下适用于 1.8.6,但抛出 LocalJumpError
1.8.7 中的(意外返回):
class Foo
def square(n)
n ** 2
end
def cube(n)
n ** 3
end
def call_block(*args, &block)
instance_exec *args, &block
end
end
block = lambda { |n|
return square(n) if n < 5
cube(n)
}
f = Foo.new
f.call_block(5, &block) # returns 125
f.call_block(3, &block) # returns 9 in 1.8.6, throws a LocalJumpError in 1.8.7
我确定,如果我替换 return
,我可以让它在 1.8.7 中工作在我的街区 next
,但是 next square(n) if n < 5
结果 nil
在 1.8.6 中。
有什么方法可以使它在 1.8.6 和 1.8.7 中都能正常工作?我知道我可以重组我的 block 以使用分支而不是提前返回,但有些 block 更复杂并且有多种情况需要提前返回。
此外,如果我想让我的代码在 ruby 1.9 中运行,这是否会进一步改变?
编辑: 我发现它在 1.8.6 而不是 1.8.7 中工作的原因是 1.8.7 定义了它自己的 instance_exec
在 C 源代码中,而 1.8.6 使用 Rails 的实现。如果我覆盖 instance_exec
在 1.8.7 和 Rails 的版本中,它也可以在那里工作。
最佳答案
评论后编辑看这个post了解详情。
class Foo
def square(n)
n ** 2
end
def cube(n)
n ** 3
end
def call_block(*args, &block)
instance_exec *args, &block
end
end
def a
block = lambda { | n|
return square(n) if n < 5
cube(n)
}
f = Foo.new
puts f.call_block(3, &block) # returns 125
puts "Never makes it here in 1.8.7"
puts f.call_block(5, &block) # returns 9 in 1.8.6, returns nothing in 1.8.7
end
a
此代码没有任何结果,因为它在 puts 语句之外返回。
proc 和 lambda 的工作方式在 1.9 中发生了变化。所以这有助于解释发生了什么。
原创
我重构了您的代码,它在所有 3 个虚拟机下都能正常工作。有趣的是,您的代码确实在 1.9 下无一异常(exception)地执行。
class Foo
def square(n)
n ** 2
end
def cube(n)
n ** 3
end
def call_block(*args, &block)
block.call(self, *args)
end
end
block = lambda { |obj, n|
return obj.square(n) if n < 5
obj.cube(n)
}
f = Foo.new
puts f.call_block(5, &block) # returns 125
puts f.call_block(3, &block) # returns 9
这post可能会有一些见解。
关于ruby-on-rails - 从提供给 instance_exec 的 block 中提前返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1711577/
问题的灵感来自 this one . Proc::new 有一个选项可以在方法内部没有 block 的情况下调用: Proc::new may be called without a block on
我需要允许在类的范围内定义和调用 block ,使用 instance_exec (通过 Rails 2.3.2)。然而,在某些情况下,其中一些 block 需要提前返回,这给我带来了问题。 我的应用
首先,对于简短版本: 方法定义不就是一个 block 吗?为什么我不能做类似的事情: obj.instance_exec(&other_obj.method(:my_method)) 目标是在单独类的
我正在为一个项目编写 DSL,我遇到了一个问题,涉及局部变量在我不希望的时候渗入嵌套过程。似乎无论我尝试什么,一旦局部变量的值被设置到 proc 的绑定(bind)中,我就无法用另一个范围的值覆盖它。
我期待代码 foo=proc{puts "foo"} instance_exec(1,2,3,&foo) do |*args , &block| puts *args block.call
我是一名优秀的程序员,十分优秀!