なぜ
Ruby Goldの学習中に探索関連の問題(REX)でつまずいたので、その過程で簡単にメモしたものを記事にしてまとめたいと思ったから。
概要
メソッドの探索と定数の探索ではそもそも違う話なんだよってこと(知っている人は多数だと思いますが、私は無知故知りませんでした)。
結局なんなん?
#####・メソッドの場合
先人が残している様々な優良記事にも記載されているよう、あるクラスの未定義インスタンスメソッドを実行しても、そこでエラーにはならず、継承元のクラスまでそのインスタンスメソッドが定義していないかを探索した後、プログラムは実行される。(ここまではギリ知っていた)
module LibertyFish
def method_a
"LibertyFish"
end
class Liberty
def method_a
"LibertyFishってなに?"
end
end
class Fish < Liberty
def fish
method_a
end
end
puts Fish.new.fish #LibertyFishってなに?
end
当然、継承関係似ないメソッドの呼び出しはエラー
module LibertyFish
def method_a
"LibertyFish"
end
# class Liberty
# def method_a
# "LibertyFishってなに?"
# end
# end
class Fish < Liberty
def fish
method_a
end
end
puts Fish.new.fish #undefined local variable or method `method_a'
end
######・定数の場合
定数の場合も、メソッドと同じようなもんだろうと高を括っていた。
以下のコードの実行結果は「Rexを開発・運営している会社」が実行される。
module LibertyFish
CONST = "Rexを開発・運営している会社"
class Liberty
CONST = "Ruby gold合格したい"
end
class Fish < Liberty
def fish
CONST
end
end
puts Fish.new.fish #Rexを開発・運営している会社
end
モジュールLibertyFishの直下にある定数をコメントアウトすれば「Ruby gold合格したい」が表示される。
module LibertyFish
# CONST = "Rexを開発・運営している会社"
class Liberty
CONST = "Ruby gold合格したい"
end
class Fish < Liberty
def fish
CONST
end
end
puts Fish.new.fish #Ruby gold合格したい
end
まとめ
メソッドの探索
①継承関連 子クラス→親クラス
②なければエラー
定数
①レキシカルスコープの内→外側
②継承関連 子クラス→親クラス
③なければエラー
あとがき
メソッドや定数の探索について混ぜて考えてしまっていたので自分なりにまとめれたと思う。
あと、この記事のものになった優良記事にはさらに詳しい定数探索について記述してあった。
【以下参照】
名前の森で定数を見つける物語
定数についてはわかった。メソッドはどうなんだい?ってノリで自分でコードを書いてさらに理解が深まったので今後もやっていきたい。