Каковы альтернативные способы передачи блоков только тогда, когда был задан блок?

#ruby

#ruby

Вопрос:

Или просто, как этот код может быть написан в менее повторяющейся версии? Или, может быть, более эффективно?

 if block_given?
  render(*options, amp;block)
else
  render(*options)
end
  

Комментарии:

1. кстати, вы должны принимать полезные ответы 🙂

2. извините, только что принято. большое спасибо 🙂

Ответ №1:

Используйте параметр block . Он обрабатывает обе ситуации.

 def foo(*options, amp;block)
  bar(*options, amp;block)
end
  

Пример:

 def bar(*options)
  p options
  p yield if block_given?
end

foo(1)
# >> [1]

foo(2) { 'hello' }
# >> [2]
# >> "hello"
  

Комментарии:

1. @CarySwoveland: да, я должен был прикрепить исполняемый фрагмент. 🙂

2. Для неверующих : def bar(options, amp;block); puts block_given? ? block.call(3) : "no block"; end; end . Затем foo(1) { |n| puts "#{n} blind mice" } #=> "3 blind mice" и foo(1) #=> "no block" . В качестве альтернативы, block.call(3) может быть заменен на yield 3 , если bar не нужно передавать блок proc другому методу. (Это пересмотр предыдущего комментария.)