0
0

More than 1 year has passed since last update.

Rubyの探索関連で迷った話

Posted at

なぜ

Ruby Goldの学習中に探索関連の問題(REX)でつまずいたので、その過程で簡単にメモしたものを記事にしてまとめたいと思ったから。

概要

メソッドの探索と定数の探索ではそもそも違う話なんだよってこと(知っている人は多数だと思いますが、私は無知故知りませんでした)。

結局なんなん?

・メソッドの場合

先人が残している様々な優良記事にも記載されているよう、あるクラスの未定義インスタンスメソッドを実行しても、そこでエラーにはならず、継承元のクラスまでそのインスタンスメソッドが定義していないかを探索した後、プログラムは実行される。(ここまではギリ知っていた)
 

main.rb
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

当然、継承関係似ないメソッドの呼び出しはエラー

error.rb
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を開発・運営している会社」が実行される。

main.rb
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合格したい」が表示される。

main.rb
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

まとめ

メソッドの探索
①継承関連  子クラス→親クラス
②なければエラー

定数
①レキシカルスコープの内→外側
②継承関連  子クラス→親クラス
③なければエラー

あとがき

メソッドや定数の探索について混ぜて考えてしまっていたので自分なりにまとめれたと思う。
あと、この記事のものになった優良記事にはさらに詳しい定数探索について記述してあった。
【以下参照】
名前の森で定数を見つける物語

定数についてはわかった。メソッドはどうなんだい?ってノリで自分でコードを書いてさらに理解が深まったので今後もやっていきたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0