【问题标题】:How to test for a time span parameter?如何测试时间跨度参数?
【发布时间】:2012-04-23 20:03:20
【问题描述】:

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

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

【问题讨论】:

  • 基于变量的实际类的切换行为通常不受欢迎,因为它破坏了duck typing,这是一种非常棒的编程方式,您不应该通过过度急切的类型检查将其丢弃。请记住:大多数时候类型是无关紧要的。重要的是提供的界面和行为。

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


【解决方案1】:

从控制台可以看出,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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多