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にオブジェクトを取得したら、" " の出力を取得することは可能ですか?acall 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 に答える