Подтвердить что ты не робот

Когда использовать блоки

Я люблю блоки Ruby! Идея, стоящая за ними, очень удобна и очень удобна.

Я только что просмотрел свой код с прошлой недели или около того, и это в основном каждая рубиновая функция, которую я когда-либо писал, и я заметил, что ни один из них не возвращает значение! Вместо того, чтобы возвращать значения, я всегда использую блок для передачи данных обратно!

Я даже поймал себя на созерцании написания небольшого класса статуса, который позволил бы мне написать код вроде:

something.do_stuff do |status|
  status.success do 
    # successful code
  end

  status.fail do
    # fail code
    puts status.error_message
  end
end

Я слишком часто использую блоки? Есть ли время для использования блоков и времени для использования возвращаемых значений?

Есть ли какие-либо проблемы, о которых нужно знать? Будет ли мое огромное использование блоков приходить и укусить меня когда-нибудь?

4b9b3361

Ответ 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

Код должен вызываться как до, так и после выхода

Вы видите это в некоторых помощниках рельсов:

 &lt% content_tag :div do  %>
     &lt%= content_tag :span "span content" %>
  &lt% end -%>

И, конечно, итераторы - это большой вариант использования, поскольку они (считаются рубинами) красивее, чем for петли или список понятий.

Конечно, не исчерпывающий список, но я рекомендую вам не просто использовать блоки, потому что вы можете.

Ответ 2

Это то, что люди функционального программирования называют стиль продолжения прохождения. Это правильная техника, хотя бывают случаи, когда она будет усложнять вещи больше, чем стоит. Возможно, стоит переустановить некоторые места, в которых вы его используете, и посмотреть, не произошло ли это в вашем коде. Но в этом нет ничего неправильного.

Ответ 3

Мне нравится этот стиль. Это на самом деле очень похоже на Ruby, и часто вы увидите, что проекты реструктурируют свой код, чтобы использовать этот формат, а не что-то менее читаемое.

Возвращаемые значения имеют смысл, когда возвращающие значения имеют смысл. Если у вас есть объект Article, вы хотите, чтобы article.title возвращал заголовок. Но для этого конкретного примера обратных вызовов, это звездный стиль, и хорошо, что вы знаете, как их использовать. Я подозреваю, что многие новые для Ruby никогда не поймут, как это сделать хорошо.