Ruby中的Sleep语句不接受任何rails转换

时间:2012-10-01 10:49:47

标签: ruby-on-rails ruby

我觉得这很奇怪。为什么我无法做到这一点?:

puts Time.now
x=2
puts x
puts x.class
sleep x
puts Time.now
x=x.seconds
puts x
puts x.class
sleep (x)
puts Time.now

我得到的输出是:

Mon Oct 01 16:14:58 +0530 2012
2
Fixnum
Mon Oct 01 16:15:00 +0530 2012
2
Fixnum
rake aborted!
can't convert ActiveSupport::Duration into time interval
/Users/hariharanganapathiraman/Documents/MigrationScripts/sample/lib/import/boot.rb:23:in `sleep'

同样,它不适用于.minutes.days

2 个答案:

答案 0 :(得分:5)

那是因为ActiveSupport::Duration将自己模仿为Fixnum类:

ActiveSupport::Duration.new(3600, [[:seconds, 3600]]).class #=> Fixnum

使用sleep(2.seconds.to_i)

答案 1 :(得分:3)

问题在于ActiveSupport::Duration 它继承自BasicObject只有有限数量的方法且没有class方法。 如果您查看ActiveSupport :: Duration implementation,您会看到所有方法都被代理(通过method_missing)到@value,在您的情况下就是Fixnum。

因此,由于ActiveSupport::Duration没有类方法,因此您对x.seconds 的类调用转到Fixnum