1

私は次の問題に苦しんでいます:

$ rails c
Loading development environment (Rails 3.2.1)
irb(main):001:0> 2.class
=> Fixnum
irb(main):002:0> Fixnum === 2
=> true
irb(main):003:0> 2.hours.class
=> Fixnum
irb(main):004:0> Fixnum === 2.hours
=> false
irb(main):005:0> 

指定されたパラメータがシンボルなのかタイムスパンなのかをテストしたいと思います。私がRuby/Railsの自然な方法だと思った方法は次のとおりです。

case param
when :today then
  # do this...
when Fixnum then
  # do that...
else
  raise ArgumentError ...
end

ActiveSupportのソースコードからわかる限り、Fixnum===はオーバーライドされません。だから、私は何が間違っているのですか?

4

1 に答える 1

2

コンソールから見ることができますが、メソッドがオーバーライドされているため、それ2.hoursはできません。Fixnumのふりをしているだけですが、そうです(ソースを参照)Fixnum#inspectActiveSupport::Duration

> 2.hours
=> 7200 seconds 
> 2.hours.to_i
=> 7200

いくつかのメソッドに応答するかどうかを確認することをお勧めします。に応答する場合to_i、それはシンボルではありません。

> :today.respond_to?(:to_i)
=> false 
> 2.hours.respond_to?(:to_i)
=> true 
于 2012-04-23T20:14:54.377 に答える