2012-10-04 97 views
1
a = '12' 

我想檢查這個對象是否有時間值。假設我做a.try(:to_time)。這返回一個ArgumentError。我可以檢查一個值是否爲接收truefalse響應的時間值?如何檢查對象是否有時間值?

+0

如何將'一個='12''有時間價值?它是一個帶有「12」的字符串。你想知道是否有一系列代表'12:00'的數字嗎?你的問題不是很清楚你想要什麼。 –

+0

@theTinMan只是爲了練習的目的,假設12是一個不正確的值。我不想把這個變成時間... –

回答

3
a = "12" 
p a.is_a?(Time)  #false 
p a.class == String #true 
p a.is_a?(Object) #true (a's class or superclass) 
+0

這是我真正想要的。謝謝! –

4

您可以使用respond_to?來檢查對象是否響應該方法。

a.respond_to?(:to_time) 

編輯

它提出ArgumentError這是我之前錯過。 respond_to?幫助NoMethodError,但不是ArgumentError

你應該看看to_time的定義,以便知道該方法有多少個參數和參數。

+0

如果我做a.respond_to?(:to_time),它會返回true。 –

+0

@MariusPop:真的嗎?當我做'a ='12'時; a.respond_to?(:to_time)'它返回'false'。 – Davidann

+0

@Davidann它會更好,如果它會返回false,因爲如果我嘗試將其轉換爲時間,它會引發ArgumentError –

-1

要解析的時候儘量使用Time.parse

irb(main):002:0> Time.parse('12:00') 
=> 2012-10-04 12:00:00 -0700 
irb(main):003:0> Time.parse('the time is 12:00') 
=> 2012-10-04 12:00:00 -0700 
irb(main):005:0> Time.parse('jan 1, 1970 11:11') 
=> 1970-01-01 11:11:00 -0700 

注意,這個失敗默默:

irb(main):004:0> Time.parse('12 noon') 
=> 2012-10-12 00:00:00 -0700 
-2

它不會出現,有一個內置的方法來做到這一點。但是你總是可以重載String模型。喜歡的東西 -

class String 
     def to_time 
      begin 
      Time.parse(self) 
      rescue Exception => exception 
      return false 
      end 
      return true 
     end 
    end 
+1

我不認爲猴子修補像String這樣的常用類是一個好主意。這樣做可能會導致意想不到的結果。 – Davidann

+0

你可能是對的,覆蓋現有的方法將是一個壞主意(畢竟,這個補丁會抹掉to_time函數,你絕對不會想這麼做)。所以你可以把它寫成一個叫做can_parse_to_time的新方法? –