这个错误似乎不应该发生。
我有一个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对象转换为字符串,当我在循环之外单独解析字符串时它可以工作,但是在循环中它会抛出此错误。
我不明白为什么会这样。
答案 0 :(得分:3)
此代码存在两个问题:
i.each do
毫无意义; 那说:
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