1

我正在将一个块传递给一个延迟执行的方法,例如

a = Proc.new do 
   puts "call me later"
end

假设我使用它来缓存昂贵的调用。现在假设我不想让我的部分代码现在运行,而我的部分代码在以后运行类似这样

    a = Proc.new do |c|
      puts "call me later"
      c.some_method do
        puts "call me now"
      end
    end

call me now一旦你有对象a 而不调用代码输出“ ” ,是否可以获得“ ”的输出call me later

4

1 回答 1

0

我不确定你到底想要完成什么,但你所拥有的是一个 Proc,它期望一个对象作为参数传递,并且该对象有一个接受块的方法。

module ModB
  def self.some_method
    puts 'some_method before yield'
    yield
    puts 'some_method after yield'
  end
end

proc_a = Proc.new do |b|
  puts 'proc_a called'
  b.some_method do
    puts 'block called'
  end
end

proc_a.(ModB)
# proc_a called
# some_method before yield
# block called
# some_method after yield

所以, proc_a 要么需要某种标志

proc_a = Proc.new do |run_me, b|
  puts 'proc_a called' if run_me
  b.some_method do
    puts 'block called'
  end
end

或者,您应该单独存储 some_method 的块。

proc_a = Proc.new do
  puts 'proc_a called'
end

proc_b = Proc.new do
  puts 'block called'
end

proc_a.()
# proc_a called

ModB.some_method(&proc_b)
#   some_method before yield
#   block called
#   some_method after yield
于 2012-10-10T04:22:12.573 回答