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,因为它的#inspect方法被覆盖了。它只是假装是 Fixnum,但它确实是ActiveSupport::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 回答