質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

657閲覧

ruby:ハッシュを要素に持つ配列における要素の更新

sardine_bird

総合スコア1

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/11/16 15:37

前提・実現したいこと

rubyを使ってハッシュを要素に含む配列を作り、あるインデックス番号のある要素に後から値を代入するプログラムを書いています。
具体的には、arrayのハッシュ番号[i]のnameキーに各曜日を代入したいです。

発生している問題・エラーメッセージ

下記ソースコードを実行すると、次の結果が出力されます。

array => [{:name=>"土", :work=>nil}, {:name=>"土", :work=>nil}, {:name=>"土", :work=>nil}, {:name=>"土", :work=>nil}, {:name=>"土", :work=>nil}, {:name=>"土", :work=>nil}, {:name=>"土", :work=>nil}]

このように、すべての要素のname keyに土曜日が入ってしまいます。

該当のソースコード

ruby

1array=Array.new(7,{name: nil, work: nil}) 2Day = %w(日 月 火 水 木 金 土) 3i=0 4Day.each do |day| 5 array[i][:name]=day 6 i+=1 7end

試したこと

irbにて、array配列を作成し、array[0][:name]に直接"日"を入れようとしましたが、同一の現象が起こりました。

ruby

1$ irb 2irb(main):001:0> array=Array.new(7,{name: nil, work: nil}) 3=> [{:name=>nil, :work=>nil}, {:name=>nil, :work=>nil}, {:name=>nil, :work=>nil}, {:name=>nil, :work=>nil}, {:name=>nil, :work=>nil}, {:name=>nil, :work=>nil}, {:name=>nil, :work=>nil}] 4irb(main):002:0> Day = %w(日 月 火 水 木 金 土) 5=> ["日", "月", "火", "水", "木", "金", "土"] 6irb(main):003:0> array[0][:name]="日" 7=> "日" 8irb(main):004:0> array 9=> [{:name=>"日", :work=>nil}, {:name=>"日", :work=>nil}, {:name=>"日", :work=>nil}, {:name=>"日", :work=>nil}, {:name=>"日", :work=>nil}, {:name=>"日", :work=>nil}, {:name=>"日", :work=>nil}]

補足情報

bash

1$ ruby -v 2ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux] 3$ irb --version 4irb 1.2.6 (2020-09-14)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

array=Array.new(7,{name: nil, work: nil})

は駄目です。オブジェクトは1つだけなので、7つとも全部1つのHashオブジェクトを指しています。
7つのオブジェクトを生成するためには、

RUby

1array=Array.new(7) { {name: nil, work: nil} }

と、ブロックが必要です。こうすると、ブロックが要素の数7回呼び出され、それぞれの要素になります。

投稿2020/11/16 16:20

編集2020/11/16 16:22
otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sardine_bird

2020/11/17 08:23

無事に解決しました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問