MY_CONSTANT = "I’m from the my module scope" class ParentClass MY_CONSTANT = "I’m from the super class scope” end class MyClass < ParentClass MY_CONSTANT = "I’m from the current scope” def self.show_constant puts MY_CONSTANT end end end Ruby の定数探索アルゴリズム
MY_CONSTANT = "I’m from the my module scope" class ParentClass MY_CONSTANT = "I’m from the super class scope” end class MyClass < ParentClass MY_CONSTANT = "I’m from the current scope” def self.show_constant puts MY_CONSTANT end end end Ruby の定数探索アルゴリズム 定数参照している スコープから 探索開始
MY_CONSTANT = "I’m from the my module scope" class ParentClass MY_CONSTANT = "I’m from the super class scope” end class MyClass < ParentClass MY_CONSTANT = "I’m from the current scope” def self.show_constant puts MY_CONSTANT end end end Ruby の定数探索アルゴリズム 外側のスコープ を探索
MY_CONSTANT = "I’m from the my module scope" class ParentClass MY_CONSTANT = "I’m from the super class scope” end class MyClass < ParentClass MY_CONSTANT = "I’m from the current scope” def self.show_constant puts MY_CONSTANT end end end Ruby の定数探索アルゴリズム スーパークラス を探索
MY_CONSTANT = "I’m from the my module scope" class ParentClass MY_CONSTANT = "I’m from the super class scope” end class MyClass < ParentClass MY_CONSTANT = "I’m from the current scope” def self.show_constant puts MY_CONSTANT end end end Ruby の定数探索アルゴリズム トップレベルを探索
MY_CONSTANT = "I’m from the my module scope" class ParentClass MY_CONSTANT = "I’m from the super class scope” end class MyClass < ParentClass MY_CONSTANT = "I’m from the current scope” def self.show_constant puts MY_CONSTANT end end end Ruby の定数探索アルゴリズム 見つからなかったら エラーを返す
User::ROLES end end # app/models/user.rb class User < ApplicationRecord ROLES = ["member", "guest"] end 定数参照の失敗例① model のUser::ROLES を 参照したかったのに controller のUser が参照され エラーになってしまった... ~階層化していたcontroller の名前空間とmodel のクラス名が被ってしまったケース~
User::ROLES end end # app/models/user.rb class User < ApplicationRecord ROLES = ["member", "guest"] end 定数参照の失敗例① ~階層化していたcontroller の名前空間とmodel のクラス名が被ってしまったケース~ ::User::ROLES のように トップレベルから 参照すればOK
Aws::S3::Client.new(region: ‘xxxx’) end end end end 定数参照の失敗例② 〜名前空間がネストしたモジュールやクラス〜 unitialized constant Wrapper::Aws::S3::Client というエラーが発生🥺 Aws::S3::Client はgem に定義されたクラス
Aws::S3::Client.new(region: ‘xxxx’) end end end end 定数参照の失敗例② 〜名前空間がネストしたモジュールやクラス〜 Wrapper::Aws::S3 と みなされて、Client という 定数は存在しない、と エラーになっていた💦 Wrapper まで辿って Aws::S3 を発見!