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

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

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

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

ハッシュ

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

Q&A

解決済

2回答

1555閲覧

ハッシュのブロックについて

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

ハッシュ

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

0グッド

0クリップ

投稿2015/11/26 12:52

たのしいRubyのハッシュクラスにこんなサンプルがありました。

ハッシュクラスオブジェクトからキーを取り出して大文字にしているのはわかりますが、
なぜ
p h["x"] #=>"X"
p h["y"] #=>"Y"
これが成立するのかがわかりません。

特にこの代入の意味がわかりません。
h= Hash.new do |hash,key|
hash[key] = key.upcase
end
どういう仕組みでこうなっているのでしょうか?

よろしくお願いいたします。

h= Hash.new do |hash,key|
hash[key] = key.upcase
end

h["a"] = "b"

p h["a"] #=>"b"
p h["x"] #=>"X"
p h["y"] #=>"Y"

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

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

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

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

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

guest

回答2

0

Hash.new doのブロックはデフォルト値を設定するために使用しています。
そして、デフォルトは何にしているかというと、keyに当たる部分が配列のインデックスとなり、
処理の中を見るとkey.upcaseで大文字にしたものをインデックスkeyに設定しています。

そして実行時にh["x"]でインデックスkeyをxを渡してます。なのでブロックで処理が実行されてXになります。

投稿2015/11/26 13:20

matsumoto

総合スコア590

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

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

退会済みユーザー

退会済みユーザー

2015/11/30 14:10

回答ありがとうございます。
guest

0

ベストアンサー

h= Hash.new do |hash,key|
hash[key] = key.upcase
end
この部分はhというHashの中にキーがkeyであるものが含まれていれば対応する値を返し、そうでない場合にはhash[key] = key.upcaseを実行(すなわち、key変数を大文字にしたものを値としたものをhashに保存)します。

h["a"] = "b"
という部分でキー"a"に対応する値に"b"を保存しています。そこで
p h["a"] #=>"b"
という結果になります。

一方、"x"と"y"をキーとするものはこのHashに含まれていませんので、hash[key] = key.upcaseの部分が呼び出され、
p h["x"] #=>"X"
p h["y"] #=>"Y"
となります。

投稿2015/11/26 13:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/11/30 14:12

回答ありがとうございます。 参考書にはこのような解説は掲載されていませんでした。 聞かなければわからないプログラムですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問