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

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

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

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

Q&A

1回答

1522閲覧

rubyのコードについて

reotantan

総合スコア295

Ruby

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

0グッド

0クリップ

投稿2015/08/19 05:42

このコードの理解に苦戦しています。
class OrderedHash
def initialize()
@keys = Array.new()
@content = Hash.new()
end

def
@content[key]
end

def []=(key, value)
@content[key] = value
if !@keys.include?(key)
@keys << key
end
end

def delete(key)
@keys.delete(key)
@content.delete(key)
end

def keys()
@keys
end

def each()
@keys.each{|key|
yield(key, @content[key])
}
end

end

oh = OrderedHash.new()
oh["one"] = 1
oh["two"] = 2
oh["three"] = 3
oh["two"] = 4
p oh.keys()
oh.each{|key,value|
p [key, value]
}
配列とハッシュインスタンスをインスタンス変数(@keys,@content)に入れて
結局このコードは何をしているのでしょうか?
def
@content[key]
end
これは[]という名前のメソッドという事ですか?それとも引数を入れるものですか

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

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

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

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

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

guest

回答1

0

OrderedHashクラスは、その名の通り「順番付きのハッシュ」クラスであるようです。
ruby1.8まではハッシュは要素の順番を保持しない仕様となっており、ハッシュ内の値をeachメソッドで取得する際、結果は挿入した順番と違ってしまうことがありました。

OrderedHashクラスでは内部でハッシュのキーを配列に格納しておき、eachメソッドでその配列を経由してハッシュ内の値を取得することで、挿入順に値を取得できるようにしているようです。
ただし、Ruby1.9以降ではハッシュは要素の順番を保持する仕様になったため、このようなクラスを用意する意味は無くなっていると思います。

[]については、[]という名前のメソッドをオーバーライドしています。
ですから、以下のように呼び出すことでOrderedHash内の値を取得することもできます。

ruby

1p oh.[]("one") # -> 1

一方、[]という名前のメソッドは特別に以下のように呼び出すこともできます。

ruby

1p oh["one"] # -> 1

このように、Rubyでは一部の決まった名前のメソッドをオーバーライドすることで、演算子オーバーライド相当の動作を実現することができます。

投稿2015/08/19 06:12

hy3

総合スコア594

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問