以下代码中的构造函数接收参数中的DateTime对象
class Test
attr_accessor :dateTime
# Takes DateTime object as input
def initialize(dateTime)
@dateTime = dateTime
end
end
如何验证传递给构造函数的dateTime参数是否是有效的dateTime对象?
找到答案的一种方法是使用:
if dateTime.class == DateTime
但是有更好的方法吗?
请记住,dateTime是dateTime对象,而不是字符串
您可以通过dateTime.is_a?(DateTime)
进行检查,它将返回布尔
可能使用is_a?
或kind_of?
,以灵活处理潜在的子类。
http://www.ruby-doc.org/core/classes/Object.html#M001033
尝试使用is_a?
方法,这样,如果对象是目标类(DateTime)的实例或子类,则可以接受它:
dateTime.is_a?(DateTime)
如果你只想确保你得到了DateTime的一个实例(或一个子类),那么其他"是is_a?
"的答案就是你想要的。
然而,你应该考虑对你的投入多一点宽容。如果有人递给你一根像"2011-06-28 23:31:11"这样的绳子怎么办?对大多数人来说,这是一个DateTime,尽管Ruby认为它是String的一个实例。如果你想变得更友好,你可以试试DateTime.parse
这个:
begin
dt = dt.is_a?(DateTime) ? dt : DateTime.parse(dt)
rescue ArgumentError
# Do your failure stuff here
end
或者,如果你在Rails:
begin
dt = dt.to_datetime
rescue ArgumentError, NoMethodError
# Do your failure stuff here
end
这些方法在不损失任何东西的情况下为您提供了很大的灵活性。宽容你的投入,但严格你的产出。
作为参考,在Rails3中,以下有to_datetime
方法:
- 日期
- 日期时间
- 时间
- 字符串