Как я могу делегировать вызов, проходящий через блок, который пришел с ним? - PullRequest
0 голосов
/ 01 апреля 2011

Я пересекаю граф объектов и хочу передать ему блок, который будет выполняться на каждом узле структуры из метода - давайте назовем visit .

Вверху я собираюсь позвонить с помощью блока, и я хочу делегировать начальный вызов для посещения корневого объекта для посещения других объектов. Я могу распаковать блок в процесс локально, используя & last_parameter_name - но как мне превратить процесс обратно в блок при моем делегированном вызове?

Вот упрощенный пример, когда я вызываю first (...) и хочу передать блок моему вызову second (...)

def second(&block)   # ... ? ...
  block.call(72)
end

def first(&block)
  puts block.class     # okay - now I have the Proc version
  puts 'pre-doit'
  block.call(42)
  puts 'post-doit'
  second( ... ? ...)   # how do I pass the block through here?
end

first {|x| puts x*x}

Примечание: мне нужно иметь одинаковые соглашения для first () и second () здесь, т. Е. Они должны использовать одни и те же вещи.

Прочитав и попробовав ответы, я нашел более полный рабочий пример:

class X 
  def visit(&x)
    x.call(50)
  end
end

class Y < X
  def visit(&x)
    x.call(100)
    X.new.visit(&x)
  end
 end

Y.new.visit {|x| puts x*x}

Ответы [ 3 ]

6 голосов
/ 01 апреля 2011

Если я вас правильно понимаю, то просто

second &block
1 голос
/ 02 апреля 2011

Этот явный обход блоков не всегда необходим, если вы используете yield .

def first( &block )
  puts block.class     # okay - now I have the Proc version
  puts 'pre-doit'
  yield 42
  puts 'post-doit'
  second( &block ) #the only reason the &block argument is needed. yield 42 can do without.
end

def second #no block argument here, works all the same 
  yield 72
end

first {|x| puts x*x}
0 голосов
/ 01 апреля 2011

Просто вызовите second и передайте ему блочную переменную (в данном случае Proc).

second block
...