Ruby中的Proc.new:我什么时候需要使用它



示例中的date_validator有一个注释:

Using Proc.new prevents production cache issues

这是否意味着,在我的代码中,在我使用当前时间相关方法的任何地方(time.now、1.day.ince(time.szone.now)等),我都应该用Proc.new{}包围它们?

我不完全理解这一点,因为更换了

time_now = Time.now.utc

带有

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

这对我来说毫无意义(返回了新类型的对象)。

因此,问题是,我应该在何时以及如何将Proc.new与时间相关的方法结合使用?这仍然适用于Ruby(1.92)和Rails(3.1)的最新版本吗?

否,它只引用给定的示例:

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将在验证实际运行时进行评估,而不是在最初解释时进行评估。

Proc.new(和lambda)所做的是,将所有语句保存为原始形式(在匿名函数中),并且不对其求值。

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的函数。

最新更新