在ruby块中传递变量

时间:2015-02-02 09:36:19

标签: ruby lambda scope closures

简单的代码,不知道如何使其工作:

def foo(&block)
  bar = 0
  block.call
end

foo do
  puts bar
end

如何管理阻止使用bar方法范围内的foo变量?

我尝试实施DSL,其中一项功能是定义如何解析IO中的数据并将其转换为Request变量。

所以我想创建这样的文件:

class FooParser < AbstractParser
  read_from_io do
    request = io.readline
  end
end

定义,read_from_io应该如何直接工作。

所以我认为,我的AbstractParser应该是这样的:

class AbstractParser
  def initialize
    @io = IO.new
    @request = ""
  end

  def read_from_io(&block)
    @io_reader = block
  end

  ....

  def read
    io = @io
    request = @request
    #here i want to pass io and request to block
    @io_reader.call
  end
end

1 个答案:

答案 0 :(得分:1)

只需将其传递给一个区块:

def foo
  bar = 0
  yield bar
end

foo do |bar|
  puts bar
end

或者,如果您确实需要将您的区块视为Proc

def foo(&block)
  bar = 0
  block.call bar
end