2

これはとても奇妙だと思いました。なぜ私はこれを行うことができないのですか?:

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

4

2 に答える 2

5

これは、クラスActiveSupport::Durationとして自分自身を模倣しているためです。Fixnum

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

を使用しsleep(2.seconds.to_i)ます。

于 2012-10-01T11:10:12.480 に答える
3

問題は、メソッドの数が限られており、メソッドがないことActiveSupport::Duration から継承されていることです。ActiveSupport :: durationの実装を見ると、すべてのメソッドが(method_missingを介して)プロキシされていることがわかります。これは、あなたの場合はFixnumです。BasicObjectclass@value

したがって、ActiveSupport::Durationにはクラスメソッドがないため、クラスの呼び出しはにx.seconds なりFixnumます。

于 2012-10-01T11:28:51.787 に答える