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

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

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

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

Q&A

解決済

2回答

2579閲覧

[ruby] clearメソッド

ysato.5654

総合スコア12

Ruby

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

1グッド

1クリップ

投稿2016/06/16 15:58

rubyのclearメソッドについて質問があります。

下記のように、配列arrにハッシュhを追加していくプログラムを作成したとします。

ruby

1arr = Array.new 210.times{ |i| 3 h = Hash.new 4 b[:key] = i 5 6 arr.push h 7 8} 9puts arr

この場合、配列arr

ruby

1arr = [{:key => 0}, {:key => 1}, ..., {:key => 9}]

となり、これは期待通りの結果なので問題ないのですが、

次に下記のようにarr.push hの後にh.clearを入れて、ハッシュhを毎回ループ処理の最後に空にするプログラムを考えます。

ruby

1arr = Array.new 210.times{ |i| 3 h = Hash.new 4 b[:key] = i 5 6 arr.push h 7 8 h.clear 9} 10puts arr

実行すると、配列arr

ruby

1[{}, {}, ..., {}]

のようになってしまいます。
ハッシュhに対してclearメソッドを使用しているのですが、配列arrも空になる仕様なのでしょうか?

ご存知の方がいれば教えていただきたいです。
よろしくお願いいたします。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

それはそうなります。
ArrayにHashを入れるときに、Hashのコピーを作って入れるわけじゃなくて、そのHashそのものを入れるので、そのHashをclear(要素をすべて削除)すれば、空になります。

オブジェクトのコピーは、dupやclone等で明示的に行わない限り、されません。

追記(もっとシンプルな例):

Ruby

1a = {:foo=>1} # Hashを生成して、それに a という名前を付ける 2b = a # a という名前の付いたHashに b という別名を付ける 3p b #=> {:foo=>1} # その a および b という名前の付いたHashを表示する 4a.clear # a および b という名前の付いたHashの内容を空にする 5p b #=> {} # a および b という名前の付いたHashは空である

1つのオブジェクトにはいくつでも名前を付けられます。

投稿2016/06/16 20:52

編集2016/06/16 23:30
otn

総合スコア84505

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

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

0

ベストアンサー

arr.push h h.clear

arr.push h arr[-1].clear

と同じですね。

arr.puch h は、 arr に h そのものが追加されるのです。(コピーが代入されるのではありません)
その後に h を操作すれば、arr から参照したときも操作内容が反映されたものとなります。

次のプログラムの実行結果が理解できますか?
(配列に追加するのをハッシュから文字列に変更しています。)
理解できなければ、コメント又は別投稿で質問してください。

a.rb

arr = Array.new 2.times { |i| s = 'ABC' arr.push s s.downcase # 新しい 文字列が返るだけ。s 自体は変化しない } p arr 2.times { |i| s = 'ABC' arr.push s s.downcase! # s 自体が変更される } p arr arr[0].downcase arr[1].downcase! p arr

実行結果

$ ruby a.rb "ABC", "ABC"] ["ABC", "ABC", "abc", "abc"] ["ABC", "abc", "abc", "abc"]

参考情報:

投稿2016/06/16 22:19

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問