2

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

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 对象会很高兴地检查一堆东西,让他们决定用什么来更新他们的值。当然,积木是我写的,所以(我认为)他们不应该做我没有计划的事情......

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

4

2 回答 2

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
于 2012-07-11T05:54:37.907 回答
2

也许我遗漏了一些东西,但为什么不直接存储block在您的实例变量中:

def make_initial_attributes(&block)
    @some_block = block
end

然后,因为block是 a Proccall所以它:

def rebuild_attributes
    @some_block.call
end 
于 2012-07-11T05:54:28.123 回答