13

在 RoR 的所有教程中,我看到了编码人员选择使用 Proc.new 的实例,而这似乎既不必要又没有吸引力。

例如,这是一个放置在模型中的回调,一个使用 Proc.new 另一个大概做同样的事情:

class Order < ActiveRecord::Base  
  before_save :normalize_card_number,  
    :if => Proc.new { |order| order.paid_with_card? }  
end

class Order < ActiveRecord::Base
  before_save :normalize_card_number, :if => "paid_with_card?"
end

那么有什么区别呢?为什么使用 Proc?他们不是都叫“paid_with_card”吗?方法?

提前致谢

4

2 回答 2

16

在上面的示例中,对条件方法使用符号可能是最佳选择。

class Order < ActiveRecord::Base
  before_save :normalize_card_number, :if => :paid_with_card?
end

string 选项使用 eval 来评估字符串中的 Ruby 代码。所以就个人而言,如果调用方法,我更喜欢使用符号,如果编写短内联条件,我更喜欢使用 Proc。

根据RailsGuides 文档

使用 Proc 对象使您能够编写内联条件而不是单独的方法。此选项最适合单行。

我认为使用 Proc 可能会更好地说明这种方式:

class Order < ActiveRecord::Base
  before_save :normalize_card_number,
    :if => Proc.new { |order| order.payment_type == "card" }
end

这可能会消除对paid_with_card 的需要吗?方法。

于 2011-12-28T20:37:29.777 回答
2

我想说的是,在旧版本的 Rails 中,这就是我们过去做事的方式,并且有人添加了一个功能,您可以通过该功能传递一个字符串以作为当前模型上的实例方法进行评估。

在简单的场景中,它使旧样式变得多余,但允许将 Proc 用于更复杂的“if”语句,而仅在当前实例上使用方法是不可能实现的。

于 2011-03-01T22:57:10.207 回答