点線上の文字の羅列 Array.newとかHash.newとか

Array.newとかHash.newとか

スーパーで値下がりした加熱用の魚あら身をバター醤油焼きにしようとしては醤油の味しかしないものを作ってるfaidaです。
以前体験版がどうとか言ってましたが月末のワンマップフェス参加のため来月くらいになりそうです。アホか。
あと最近某100円ショップにて懸賞ナンプレというのを買ってきました。以前ブログに書いた通り大吉をずっと引き続けてきたのでこれも当たらないかなぁと思いつつ締め切りが全然先なのにもう終わっちゃいそうなのでどうしようか考え中です。

ところで。
以前「マップ選択システム」というスクリプトのサンプルプロジェクトを保管庫に上げていましたが(ステマ)、実用に当たって改造してほしいと依頼が来たので、(合宿中の)深夜1時から作業を始めていました。
その時ちょっと困ったことがあったので、とりあえずブログの話のタネになるかなと。
……まぁ、そんなもんです。興味ない方はスルーしてください。

長いので追記からどうぞ。


Array.new(size, val)ってやると、配列([1,2,3]とかのこと)が生成されます。sizeは配列の長さ([1,2,3]だと「3」)で、valは初期値です。
初期値というのは、配列を作るときに代入される値なんですね。例えばArray.new(3, 1)ってやると[1,1,1]が生成されます。
ハッシュ({1=>"a"}とかのこと)も(長さが無いことを除けば)同じで、Hash.new(val)で初期値をセットできます。
これを応用して、@map_select_list = Hash.new([])ってやったんですよ。
そのあと[0,1,2,3].each{|i|@map_select_list[0] << i}とやりました。そしてp @map_select_list[3]を実行するとあら不思議。[0,1,2,3]と表示されました。
最初ここでずっと躓いていて、「???」って感じだったんです。
で、ヘルプ見てやっと分かりました。「初期値に指定したオブジェクト」って、全部共通の物を使うんですよ。
つまり@map_select_list = Hash.new([])で作った[]の中身はハッシュの中身全部にコピーされちゃうわけですね。
スクリプトやってn年なのにこんなことも分からなかったのかと愕然としました。やっぱりダメね。
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

faida

Author:faida
VX/VXAceスクリプト担当。デレステP。担当の限定は逃す派。創作ブログの名の下に、デレマスSS書こうかな。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
アクセスカウンター
投票
ついったー
検索フォーム
メールフォーム

名前:
メール:
件名:
本文:

RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR