1

我正在完成我的新项目,其中 proc 用于我不理解的验证。谁能解释一下这里发生了什么?我的代码在模型中是这样的

before_validation :strip_whitespace, :if => proc{|datefield|datefield.export_date_format.present?}

def strip_whitespace
  self.export_date_format.strip!
end

为什么我们在这里使用 proc,为什么我们不能检查 datefield.export_date_format.present?在 if 条件下直接调用 :strip_whitespace 方法?proc 到底在这里做什么?

4

1 回答 1

0

1.为什么不在方法中直接检查格式?也许将方法和调用该方法的过程保持为两个不同的参数是设计的一部分。而这里的 proc 是对象,这就是为什么可以将过程作为参数传递的原因,因为 proc 是第一类对象

2.方便的是在原地定义过程然后定义方法然后只调用一次该方法。这就是其他语言中所谓的匿名函数。

3.有时它是定义只能是proc或lambda的过程的唯一方法。例如在#108 named_scope Ryan Bates 必须使用 lambda:

lambda {|*args| {:conditions => ["released_at > ?",(args.first || 2.weeks.ago)]}}

因为表达式2.weeks.ago应该在调用这个 lambda 时计算,而不是在加载表达式时计算。

于 2012-07-23T08:36:22.920 回答