Ruby on rails 当用作回调函数时,“return”和“break”在Ruby块中是否无用?

Ruby on rails 当用作回调函数时,“return”和“break”在Ruby块中是否无用?,ruby-on-rails,ruby,block,Ruby On Rails,Ruby,Block,在导轨中,例如: Ruby块中return的操作取决于块是用Proc.new还是lambda构造的 我建议您阅读另一个堆栈溢出问题的最高评分答案: 在这种情况下,块具有使用Proc.new创建的块的属性 在这种回调的上下文中调用return,只有在这样做也有意义的情况下才有意义(显然不是这样): 事实上这有点有趣 当您在Rails 3中使用before_create时,我们获取您提供的块或lambda并将其转换为一个方法。然后,我们使用当前的ActiveRecord对象调用该方法,以向后兼容旧的

在导轨中,例如:


Ruby块中
return
的操作取决于块是用
Proc.new
还是
lambda
构造的

我建议您阅读另一个堆栈溢出问题的最高评分答案:

在这种情况下,块具有使用
Proc.new
创建的块的属性

在这种回调的上下文中调用
return
,只有在这样做也有意义的情况下才有意义(显然不是这样):


事实上这有点有趣

当您在Rails 3中使用before_create时,我们获取您提供的块或lambda并将其转换为一个方法。然后,我们使用当前的ActiveRecord对象调用该方法,以向后兼容旧的Rails方法

因此,以下内容相当于您的代码段:

class User < ActiveRecord::Base
  validates_presence_of :login, :email

  before_create do
    self.name = login.capitalize if name.blank?
  end
end
在这种情况下,
值将是
[1,2,3,4]
,每个
方法的正常返回值,输出将是:

1
3
4
如果发生断裂:

value = [1,2,3,4].each do |i|
  break if i == 2
  puts i
end
在这种情况下,
将为
nil
,因为
中断
也会立即从
每个
方法返回。您可以使用
break n
强制返回特定值,这将使
value
n
相同。上述情况下的输出为:

1

重要的是,
continue
break
不仅仅适用于迭代器,尽管它们的语义在迭代器的情况下被设计成类似于C中的等价物。

@Andy-谢谢。在这种情况下,块是一个进程,但它不是用
Proc.new
lambda
构造的-它是作为块传入的。或者你在创建
之前谈论的是内部
?@Andy-阅读了这个答案后,问题是在这种情况下,
返回
将从包含方法返回。但是,如果它在类定义中,那么包含的方法是什么呢?在本例中,回调基本上是一个
Proc.new
创建的块。因此,如果我从该块返回,我将从中返回什么?您将从创建它的上下文中返回。如果在不同的上下文中执行,这会导致
LocalJumpError
。谢谢,这实际上很有意义。
value = [1,2,3,4].each do |i|
  continue if i == 2
  puts i
end
1
3
4
value = [1,2,3,4].each do |i|
  break if i == 2
  puts i
end
1