RubyのCSV::Tableクラスで作成したテーブルのカラムに値100を代入する場合、table[:id][0] = 100
は値の代入不可ですが、table[0][0] = 100
では値が代入出来るのはなぜでしょうか。
値が代入できることを疑問に思った理由は、instance method CSV::Table#[] (Ruby 2.4.0)で以下の文を見つけたためです。
値の配列を返します。この配列を変更しても元のデータには何の影響もありません。
上記の引用の内容を読み、例えば、後述するCSVファイルが合った場合、table[0][0] = 100
もtable[:id][0] = 100
のどちらを実行してもtableの値は変わらないはずではないかと考えたのですが、以下のように実行した場合、table[0][0] = 100
を実行すると値が変わってしまいます。しかし、table[:id][0] = 100
は値に変化はありません。
用意したCSVファイル
csv
1# data.csv 2 3id,name,age 41,hattori,25 52,hanzoo,35
Pryを実行
$ pry
Terminal
1[1] pry(main)> require 'csv' 2=> true 3 4[2] pry(main)> table = CSV.table('data.csv') 5=> #<CSV::Table mode:col_or_row row_count:3> 6 7[3] pry(main)> puts table 8id,name,age 91,hattori,25 102,hanzoo,35 11=> nil 12 13# 値の代入が出来ない 14 15[4] pry(main)> table[:id][0] = 100 16=> 100 17 18[5] pry(main)> puts table 19id,name,age 201,hattori,25 212,hanzoo,35 22=> nil 23 24# 値の代入が出来る 25 26[6] pry(main)> table[0][0] = 100 27=> 100 28 29[7] pry(main)> puts table 30id,name,age 31100,hattor,25 322,hanzoo,35 33=> nil
追加補足
URLで申し訳ないのですが、元は下記URLの疑問の延長となっています。
Ruby - RubyのCSV::Tableクラスで作成したカラムtable[:id][0]
に値が代入できないのはなぜですか(74846)|teratail
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/05 07:22