看到这个了吗
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
进程和lambda的工作方式在1.9中发生了变化。这有助于解释发生了什么。
起初的
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