###rubyの知識を問題を解きながら、何が分かってて何が分かっていないかを洗い出して、復習するシリーズ
という知識を深める用アウトプットをしていくよ
ではさっそく。vol.2
##問題
配列の内部に、複数のユーザーの情報をハッシュとして持つ変数user_data
user_data = [
{user: {profile: {name: 'Abc'}}},
{user: {profile: {name: 'Def'}}},
{user: {profile: {name: 'Ghi'}}},
]
全てのユーザーの「名前だけ」が出力されるように記述する。
Abc
Def
Ghi
試行錯誤で戦った経過。不毛すぎるから折りたたみ。
user_dataの定義部分は省略して書く。
user_data.each do |data|
puts data.user.profile.name
end
Traceback (most recent call last):
2: from test.rb:15:in `<main>'
1: from test.rb:15:in `each'
test.rb:16:in `block in <main>': undefined method `user' for {:user=>{:profile=>{:name=>"Abc"}}}:Hash (NoMethodError)
Did you mean? super
はい、すみません。
user_data.each do |data|
puts data{name}{profile}{name}
end
test.rb:16: syntax error, unexpected '{', expecting end
puts data{name}{profile}{name}
ですよねー。
user_data.each do |data|
puts data{{{name}}}
end
test.rb:16: syntax error, unexpected '}', expecting =>
puts data{{{name}}}
user_data = [
{user: {profile: {name: 'Abc'}}},
{user: {profile: {name: 'Def'}}},
{user: {profile: {name: 'Ghi'}}},
]
user_data.each do |data|
puts data[:user][:profile][:name]
end
キーの指定の仕方がまだ不慣れです。
##さて、おさらい
ハッシュから欲しい値を取得するには
ハッシュ名[欲しい値のキー]
(例)user_data[:user]
ちなみに問題のuser_dataで↑のようにuserだけ指定するとこのように↓返ってきました。
{:profile=>{:name=>"Abc"}}
{:profile=>{:name=>"Def"}}
{:profile=>{:name=>"Ghi"}}
今回はもっと先のnameまで指定して取得したい。
→ハッシュが多重になっている。
→キーを連続して書く
ハッシュ名[値のキー][値のキー][値のキー]
(例)user_data[:user][:profile][:name]
ちなみにこういう書き方もあるそう
user_data.each{ |data| puts data.dig(:user, :profile, :name) }
digメソッドについてはまた勉強します。
##まとめ?
んんん、正直あんまりすとんと落ちてきてない。
でも、必要なキーのところ(今回ならname)までのキーを順番に記述するのはすっきり。
最初のお試しそうしてたしね。
基礎理解が浅いまま進んでてごっちゃになってます。
今回は[:user]
この書き方をインプット。多重ハッシュの手前の基礎部分ですね。
一度苦手意識を持つと頭に入ってきづらくなるのは自分の性質なので、焦らず向き合っていこうと思います。
間違ってること、もっとこうしたらいいよというアドバイスなどありましたら、コメントいただけると嬉しいです。
では、また次の投稿で。