【发布时间】:2015-04-01 05:12:49
【问题描述】:
简单的代码,不知道怎么弄:
def foo(&block)
bar = 0
block.call
end
foo do
puts bar
end
如何管理块以使用来自foo 方法范围的bar 变量?
我正在尝试实现 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
【问题讨论】:
-
这行不通。您从
FooParser中调用read_from_io,但该方法不是类方法。我不确定 DSL 是否适合这项工作。它看起来过于复杂。您可以简单地将read_from_io实现为FooParser中的一个方法——即def read_from_io(io)——并从AbstractParser的read方法中调用它。
标签: ruby lambda scope closures