2017-04-03 68 views
0

此錯誤似乎並不像應該發生。Ruby字符串日期解析錯誤:無法將日期轉換爲字符串

我有一個二維數組:

a = [["Person", "20 Mar 2017", "20 Mar 2017", "Party"], 
["Person2", "02/27/2017", "02/28/2017", "BDay"]] 

我通過數組循環使用此代碼解析字符串日期Date對象:

a.each do |i| 
i.each do 
    i[1] = Date.parse(i[1]) && i[2] = Date.parse(i[2]) rescue i[1] = Date.strptime(i[1], "%m/%d/%Y") && i[2] = Date.strptime(i[2], "%m/%d/%Y") 
end 
end 

當我執行我的代碼我得到一個類型錯誤:can't convert Date into String 但我沒有將任何日期對象轉換爲字符串,並且當我在循環外單獨解析字符串時,它在循環中工作,但在循環中引發此錯誤。

我不明白爲什麼會發生這種情況。

+0

你希望用'evenach'做什麼? –

+0

爲了我的理解,「要做的事」對內部數組內的每個索引執行下面的代碼。 – EXC3ll3NTrhyTHM

+0

我現在看到'evenach do'是多餘的 – EXC3ll3NTrhyTHM

回答

3

有兩個問題與此代碼:

  1. i.each do是沒有意義的;
  2. 運算符的優先事宜

這就是說:

a.each do |i| 
    (i[1] = Date.parse(i[1]) && i[2] = Date.parse(i[2])) \ 
    rescue (i[1] = Date.strptime(i[1], "%m/%d/%Y") && i[2] = Date.strptime(i[2], "%m/%d/%Y")) 
end 

這樣做的更多rubyish方式:

result = a.map do |i| 
    i.map do |e| 
    Date.parse(e) rescue Date.strptime(e, "%m/%d/%Y") rescue e 
    end 
end 

由於@Stefan在評論中說,它可以更好地明確地突變所需的索引:

result = a.map do |i| 
    i.map.with_index do |e, idx| 
    case idx 
    when 1..2 
     Date.parse(e) rescue Date.strptime(e, "%m/%d/%Y") 
    else e 
    end 
    end 
end 
+0

好吧我會改變'evenach do'第二行之後的反斜槓是什麼? – EXC3ll3NTrhyTHM

+0

它告訴ruby解析器該行會在下一行繼續。我已經用更易讀的代碼片段更新了答案,它不會改變原來的對象。 – mudasobwa

+0

你能向我解釋爲什麼除了''做'我的代碼是拋出錯誤,所以我可以理解發生了什麼?它看起來像你的代碼在你的第一個例子中是一樣的,除了'evenach do'和反斜槓後面跟着一個新行。 – EXC3ll3NTrhyTHM