何时使用块

时间:2010-02-01 23:42:24

标签: ruby

我喜欢红宝石积木!他们背后的想法非常整洁方便。

我刚刚回顾了过去一周左右的代码,基本上是我写过的每一个ruby函数,我注意到其中没有一个返回一个值!我总是使用一个块来传回数据而不是返回值!

我甚至发现自己正在考虑编写一个小型的状态类,这将允许我编写如下代码:

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

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

我是否过多使用积木?是否有时间使用块和时间来使用返回值?

是否有任何需要注意的问题?我会大量使用积木来咬我吗?

3 个答案:

答案 0 :(得分:16)

整个事情会更具可读性:

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

恕我直言,避免返回布尔值是过度使用代码块。

如果,块有意义。 。

它允许代码使用资源而无需关闭该资源

 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

必须在yield

之前和之后调用代码

你在一些铁路助手中看到了这一点:

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

当然迭代器是一个很好的用例,因为它们(被ruby-ists认为)比for循环或list comprehensions更漂亮。

当然不是一个详尽的清单,但我建议你不要只使用积木,因为你可以。

答案 1 :(得分:13)

这就是人们称之为"continuation-passing style"的函数式编程。这是一种有效的技术,尽管在某些情况下,它会使事情复杂化而不是它的价值。重新查看一些你正在使用它的地方可能是值得的,看看你的代码是否就是这种情况。但它没有任何内在错误。

答案 2 :(得分:5)

我喜欢这种风格。它实际上非常类似于Ruby,通常你会看到项目重构他们的代码以使用这种格式而不是那些不太可读的东西。

返回值在返回值有意义的地方是有意义的。如果您有Article个对象,则希望article.title返回标题。但对于这个回调的特殊例子,它是一流的风格,你知道如何使用它们是好的。我怀疑Ruby的许多新手永远不知道如何做得好。