好的,这就是我想要做的事情:
我将块传递给类似:Generator.generate(...) {|x| ...}
的方法。我想存储块,因为我在一些从不同的地方被多次调用的子例程中调用它。
当然,我可以通过所有方法和调用来拖动和阻止,但我想将它实际保存在类变量中,并在适当的方法中使用它。
这样的事情:
class Generator
class << self
attr_accessor :my_block
def generate(..., &block)
my_block = &block
....each {important_method(x)}
end
def important_method(x)
my_block.yield(x)
end
end
end
是否可以存储一个块并稍后用一些参数产生它?
答案 0 :(得分:1)
如果您的方法接受&block
形式的块,则它将转换为Proc对象并可以存储到变量中。您可以稍后通过发送call
消息来调用它。
my_block.call(x)
另一个例子
class Foo
def init &block
@my_block = block
end
def process ary
ary.each do |a|
@my_block.call a
end
# or this
# ary.each(&@my_block)
end
end
f = Foo.new
f.init {|a| puts a}
f.process [1, 2, 3]
答案 1 :(得分:1)
您需要对代码进行2次调整:
class Generator
class << self
attr_accessor :my_block
def generate(..., &block)
self.my_block = block # Because otherwise you're just setting a method-local variable
....each {important_method(x)}
end
def important_method(x)
my_block.call(x) # Because this is how Proc objects are called
end
end
end