如何测试时间跨度参数?

时间:2012-04-23 20:03:21

标签: ruby-on-rails ruby time operator-overloading case

我正在努力解决以下问题:

$ 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覆盖。那么,我做错了什么?

1 个答案:

答案 0 :(得分:2)

您可以在控制台中看到2.hours不能Fixnum,因为它的#inspect方法被覆盖了。它只是伪装成Fixnum,但它是ActiveSupport::Duration(见the source

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

更好地检查它是否响应某些方法。如果它响应to_i,则它不是符号。

> :today.respond_to?(:to_i)
=> false 
> 2.hours.respond_to?(:to_i)
=> true