2017-04-03 5 views
0

このエラーは起こっていないようです。Ruby String to Date解析エラー:日付を文字列に変換できません

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 

私は2次元配列を持っていますエラー: can't convert Date into String しかし、私は文字列に任意の日付オブジェクトを変換していないと私はループの外側に個別に文字列を解析するときに動作しますが、ループでは、このエラーがスローされます。

なぜこれが起こっているのかわかりません。

+0

「ばか」を使って達成しようとしていることは何ですか? –

+0

私の理解のために、「doach」は内側の配列の内側のすべてのインデックスに対してその下のコードを実行します。 – EXC3ll3NTrhyTHM

+0

私は今すぐ参照してください 'のdoachは冗長だった – EXC3ll3NTrhyTHM

答えて

3

このコードの2つの問題があります。

  1. i.each doは意味がありません。
  2. 言っmatters-

演算子の優先順位:それを行うの

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

さて、私は'を変更する予定です '第二の行の後にバックスラッシュは何をしますか? – EXC3ll3NTrhyTHM

+0

これは、次の行で行が継続することをルビーパーサーに伝えます。私は、より読みやすいスニペットで答えを更新しました。それは、オブジェクトをインプレースに変更しません。 – mudasobwa

+0

あなたはなぜ私のコードがエラーを投げていたので、どうしたのか分かりますか?あなたのコードは、最初の例では、 '' do do''とバックスラッシュと改行の後に同じであるように見えます。 – EXC3ll3NTrhyTHM

関連する問題