Когда использовать блоки
Я люблю блоки Ruby! Идея, стоящая за ними, очень удобна и очень удобна.
Я только что просмотрел свой код с прошлой недели или около того, и это в основном каждая рубиновая функция, которую я когда-либо писал, и я заметил, что ни один из них не возвращает значение! Вместо того, чтобы возвращать значения, я всегда использую блок для передачи данных обратно!
Я даже поймал себя на созерцании написания небольшого класса статуса, который позволил бы мне написать код вроде:
something.do_stuff do |status|
status.success do
# successful code
end
status.fail do
# fail code
puts status.error_message
end
end
Я слишком часто использую блоки? Есть ли время для использования блоков и времени для использования возвращаемых значений?
Есть ли какие-либо проблемы, о которых нужно знать? Будет ли мое огромное использование блоков приходить и укусить меня когда-нибудь?
Ответы
Ответ 1
Все это было бы более читаемым, поскольку:
if something.do_stuff
#successful code
else
#unsuccessful code
end
или для использования общей идиомы рельсов:
if @user.save
render :action=>:show
else
@user.errors.each{|attr,msg| logger.info "#{attr} - #{msg}" }
render :action=>:edit
end
IMHO, избегая возврата булевского значения, является чрезмерным использованием блоков кода.
Блок имеет смысл, если.,.
Он позволяет коду использовать ресурс, не закрывая этот ресурс
open("fname") do |f|
# do stuff with the file
end #don't have to worry about closing the file
Вызывающий код должен будет выполнять нетривиальные вычисления с результатом
В этом случае вы не добавляете возвращаемое значение в область вызова. Это также часто имеет смысл с несколькими возвращаемыми значениями.
something.do_stuff do |res1, res2|
if res1.foo? and res2.bar?
foo(res1)
elsif res2.bar?
bar(res2)
end
end #didn't add res1/res2 to the calling scope
Код должен вызываться как до, так и после выхода
Вы видите это в некоторых помощниках рельсов:
<% content_tag :div do %>
<%= content_tag :span "span content" %>
<% end -%>
И, конечно, итераторы - это большой вариант использования, поскольку они (считаются рубинами) красивее, чем for
петли или список понятий.
Конечно, не исчерпывающий список, но я рекомендую вам не просто использовать блоки, потому что вы можете.
Ответ 2
Это то, что люди функционального программирования называют стиль продолжения прохождения. Это правильная техника, хотя бывают случаи, когда она будет усложнять вещи больше, чем стоит. Возможно, стоит переустановить некоторые места, в которых вы его используете, и посмотреть, не произошло ли это в вашем коде. Но в этом нет ничего неправильного.
Ответ 3
Мне нравится этот стиль. Это на самом деле очень похоже на Ruby, и часто вы увидите, что проекты реструктурируют свой код, чтобы использовать этот формат, а не что-то менее читаемое.
Возвращаемые значения имеют смысл, когда возвращающие значения имеют смысл. Если у вас есть объект Article
, вы хотите, чтобы article.title
возвращал заголовок. Но для этого конкретного примера обратных вызовов, это звездный стиль, и хорошо, что вы знаете, как их использовать. Я подозреваю, что многие новые для Ruby никогда не поймут, как это сделать хорошо.