如何将proc存储到变量中(稍后调用)

时间:2012-07-11 05:39:42

标签: ruby

我有一段代码,如果需要,应该在运行时再次进行评估。

class Test

    def initialize
        @some_block = nil
    end

    def make_initial_attributes(&block)
       # do stuff with the supplied block, and then store the block somewhere
       # for later
    end

    def rebuild_attributes
       # grab that stored block and evaluate it again
    end 
end

我有在启动时创建的Test对象,但是在整个程序中,我可能希望它们通过在启动时运行我所提供的任何块来“更新”自己。

也许程序的状态已经改变,所以这些Test对象会愉快地检查一堆东西,并让他们决定用什么来更新它们的值。当然,块是我写的(我认为)他们不应该做我没有计划的事情......

这个例子有点奇怪。基本上可以存储一段代码(这只是我相信的Proc),然后再重新评估它。

2 个答案:

答案 0 :(得分:4)

您要求的是具体的块。您只需对存储的块使用“调用”即可。这是一个例子:

class Test
    def initialize
        @some_block = nil
    end

    def make_initial_attributes(&block)
      @some_block = block
       # do stuff with the supplied block, and then store the block somewhere
       # for later
    end

    def rebuild_attributes
      @some_block.call(1)
       # grab that stored block and evaluate it again
    end
end

test = Test.new
test.make_initial_attributes do |i|
  puts i
end
test.rebuild_attributes  # 1

test.make_initial_attributes do |i|
  puts i+1
end
test.rebuild_attributes # 2

答案 1 :(得分:2)

也许我错过了一些东西,但为什么不在你的实例变量中存储block

def make_initial_attributes(&block)
    @some_block = block
end

然后,由于blockProc,只有call它:

def rebuild_attributes
    @some_block.call
end