2017-04-03 118 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