3

その例のdate_validatorにはコメントがあります:

Using Proc.new prevents production cache issues

つまり、現在の時刻に関連するメソッド(Time.now、1.day.since(Time.zone.now)など)を使用するコードのすべての場所で、それらをProc.new {}で囲む必要がありますか?

交換してから、これは完全にはわかりません

time_now = Time.now.utc

time_now = Proc.new { Time.now.utc }

私には意味がありません(新しいタイプのオブジェクトが返されます)。

したがって、問題は、時間に関連するメソッドでProc.newをいつどのように使用する必要があるかということです。そして、それは最新バージョンのRuby(1.92)とRails(3.1)にも当てはまりますか?

4

2 に答える 2

5

いいえ、指定された例のみを参照しています。

validates :expiration_date,
  :date => {:after => Proc.new { Time.now },
  :before => Proc.new { Time.now + 1.year } }

代わりにあなたが書いたなら

validates :expiration_date,
  :date => {:after => Time.now,
  :before => Time.now + 1.year }

Time.nowクラスが解析されるときに解釈され、その値に対して検証されます。

その検証でProc.newを使用すると、Time.newは、検証が実際に実行されたときに評価されます。最初に解釈されたときではありません。

于 2011-06-19T15:38:08.987 に答える
3

Proc.new(およびラムダ)が行うことは、すべてのステートメントを元の形式(無名関数)で保存し、それらを評価しないことです。

Date Validator gemには、Procが合格したかどうかを確認するための何らかのテストが必要であり、実際に検証しているときにそれを評価します。

編集:これはここで行われます-https ://github.com/codegram/date_validator/blob/master/lib/active_model/validations/date_validator.rb#L47

option_value = option_value.call(record) if option_value.is_a?(Proc)

簡単な例:

pry(main)> time_now = Time.now
=> 2011-06-19 21:07:07 +0530
pry(main)> time_proc = Proc.new { Time.now }
=> #<Proc:0x9710cc4@(pry):1>
pry(main)> time_proc.call
=> 2011-06-19 21:07:28 +0530
pry(main)> time_proc.call
=> 2011-06-19 21:07:31 +0530
pry(main)> 

これは、この種のチェックを実装するライブラリでのみ機能し、すべての関数がを受け入れるわけではないことに注意してくださいTime

于 2011-06-19T15:38:41.303 に答える