ruby version 2.6.6で起きている挙動です
bash
1$ ruby -v 2ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-darwin20]
一度文字列からCSVインスタンスをつくります。
ruby
1$ irb 2irb(main):001:0> require 'csv' 3=> true 4irb(main):002:0> raw = <<~EOF 5irb(main):003:0" name,age 6irb(main):004:0" tom,13 7irb(main):005:0" bob,14 8irb(main):006:0" alice,15 9irb(main):007:0" EOF 10=> "name,age\ntom,13\nbob,14\nalice,15\n" 11irb(main):008:0> csv = CSV.new(raw, headers:true)
問題はこの後でして、csv.first
を行うと、行うたびに結果が変わります
ruby
1irb(main):010:0> csv.first 2=> #<CSV::Row "name":"tom" "age":"13"> # ここだけは期待通り 3irb(main):011:0> csv.first 4=> #<CSV::Row "name":"bob" "age":"14"> # tomが出てこないのは期待に反する 5irb(main):012:0> csv.first 6=> #<CSV::Row "name":"alice" "age":"15"> # tomがでてこないのは期待に反する 7irb(main):013:0> csv.first 8=> nil # 論外
再度csvインスタンスを作り直して、今度は.count
を試すと、これまた気持ち悪い挙動になります。
ruby
1irb(main):014:0> csv = CSV.new(raw, headers:true) 2=> <#CSV io_type:StringIO encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"" headers:true> 3irb(main):015:0> csv.count 4=> 3 # OK 5irb(main):016:0> csv.count 6=> 0 # なんでやねん
つまるところタイトルのように、rowにアクセスするようなメソッドをcsvインスタンスにかけると、そのrowが消えてしまうという挙動があるように見えます。
どうして.first
とか.count
みたいなゲッターっぽい名前のメソッドが破壊的変更を生むのでしょうか。
また、期待通りの結果を得るためにはどうしたらよいでしょうか(csv.first
は常に1行目のrow(=tom)を返し、csv.count
は常に最初の行数(=3)を返す)
回答1件
あなたの回答
tips
プレビュー