我正在努力解决以下问题:
$ 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覆盖。那么,我做错了什么?
答案 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