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 method? を呼び出します。ここでprocは正確に何をしているのですか?

4

1 に答える 1

0

1.メソッドで直接フォーマットをチェックしないのはなぜですか? おそらく、メソッドとそのメソッドを呼び出す手順を保持するか、2 つの異なるパラメーターとして保持しないようにすることは、設計の一部です。ここで proc はオブジェクトです。そのため、プロシージャをパラメーターとして渡すことができます。これは、 proc がファースト クラス objectであるためです。

2.プロシージャをその場で定義してからメソッドを定義し、このメソッドを一度だけ呼び出すと便利です。それが、他の言語で無名関数と呼ばれるものです。

3. proc または lambda のみにできるプロシージャを定義する唯一の方法である場合があります。たとえば#108 named_scope では、 Ryan Bates はラムダを使用する必要がありました。

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

2.weeks.agoは、このラムダが呼び出されたときに評価される必要がありますが、式が読み込まれた時点では評価されないためです。

于 2012-07-23T08:36:22.920 に答える