Railsのコードを書いているときにぶつかった問題の一つと、その解決策を紹介します。
それは以下のようなコードがあったとして、Sample::Example#greetingから、他の箇所で定義された同名クラスExampleのsay_goodbyeを呼び出したい時、以下の書き方ではNoMethodErrorが発生することです。
module Sample class Example class << selfdef say_hello puts "hello!" enddef greeting Example.say_goodbye # undefined method `say_goodbye' for Sample::Example:Classend end endendclass Example class << self def say_goodbyeputs "goodbye!" end endend
そう、Sample::Exampleクラスのクラスメソッドとして、say_goodbyeを呼び出そうとしてしまっているんですね。
ではどうするか。
以下のように書くことで解決できました。
module Sample class Example class << selfdef say_hello puts "hello!" enddef greeting ::Example.say_goodbye # "goodbye!"end end endendclass Example class << self def say_goodbyeputs "goodbye!" end endend
クラス名の前に`::`演算子を付けることで、トップレベルにあるExampleクラスを呼び出してくれました。
目次