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

标签 ruby binding scope block

我想访问调用者的绑定(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/

相关文章:

javascript - AngularJS:父范围未在指令中更新(具有隔离范围)双向绑定(bind)

ruby-on-rails - 错误 NoMethodError:ActionView::Base:Class 的未定义方法 `debug_rjs='

ruby - 为什么会有私有(private)的Object::select?公共(public)选择方法来自哪里?

wpf - 如何 WPF Binding 内联编写 = 简短形式

c# - 简单的 ListView 数据绑定(bind)

Javascript 作用域——var 与 global

ruby-on-rails - Ruby on Rails 国家/州选择 Enigma

ruby - 在哪里可以找到 Ruby 文档中的字符串转义序列?

json - knockout viewModels,单个大一个还是多个?

Javascript:将函数指针放入对象中?