Ruby String to Date解析错误:无法将Date转换为String

时间:2017-04-03 17:54:38

标签: arrays ruby string loops date

这个错误似乎不应该发生。

我有一个2D数组:

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 但是我没有将任何Date对象转换为字符串,当我在循环之外单独解析字符串时它可以工作,但是在循环中它会抛出此错误。

我不明白为什么会这样。

1 个答案:

答案 0 :(得分:3)

此代码存在两个问题:

  1. i.each do毫无意义;
  2. 运营商优先事项 -
  3. 那说:

    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 
    

    这种做法更为红润:

    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