gpt4 book ai didi

ruby - 如何调用 ruby​​ block 以访问调用方绑定(bind)

转载 作者:数据小太阳 更新时间:2023-10-29 06:41:53 27 4
gpt4 key购买 nike

我想访问调用者的绑定(bind)。这里有什么问题吗?

require 'test/unit'

class BlocksTest < Test::Unit::TestCase

class Blocks
def initialize( &block ); @block = block; end
def run; instance_eval { @block.call }; end

def foo; 'foo'; end
end

def test_say_foo_via_string
assert_equal( 'foo', Blocks.new{ 'foo' }.run )
end
# => successful

def test_say_foo_via_caller_method
assert_equal( 'foo', Blocks.new{ foo }.run )
end
# => NameError: undefined local variable or method `foo'

end

为什么我无法访问给定 block 中的调用方实例?

最佳答案

在 block 内,您不在 Blocks 实例的范围内,因此 foo 不可见。如果你想访问它,你必须将对象传递给 block :

class Blocks
# ...
def run
@block.call(self)
end
# ...
end

blk = Blocks.new { |b| b.foo }
blk.run
# => "foo"

或者,您可以将 block 传递给 instance_eval:

class Blocks
# ...
def run
instance_eval(&@block)
end
# ...
end

blk = Blocks.new { foo }
blk.run
# => "foo"

关于ruby - 如何调用 ruby​​ block 以访问调用方绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17400422/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com