#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 другому методу. (Это пересмотр предыдущего комментария.)