【Ruby】同名クラスの別メソッドを呼び出すTips

Categories:Ruby

Railsのコードを書いているときにぶつかった問題の一つと、その解決策を紹介します。

それは以下のようなコードがあったとして、Sample::Example#greetingから、他の箇所で定義された同名クラスExampleのsay_goodbyeを呼び出したい時、以下の書き方ではNoMethodErrorが発生することです。

module Sample
  class Example
    class << self
      def say_hello
        puts "hello!" 
      end
      
      def greeting
        Example.say_goodbye
        # undefined method `say_goodbye' for Sample::Example:Class
      end
    end
  end
end

class Example
  class << self
    def say_goodbye
      puts "goodbye!"
    end
  end
end

そう、Sample::Exampleクラスのクラスメソッドとして、say_goodbyeを呼び出そうとしてしまっているんですね。

ではどうするか。

以下のように書くことで解決できました。

module Sample
  class Example
    class << self
      def say_hello
        puts "hello!" 
      end
      
      def greeting
        ::Example.say_goodbye
        # "goodbye!"
      end
    end
  end
end

class Example
  class << self
    def say_goodbye
      puts "goodbye!"
    end
  end
end

クラス名の前に`::`演算子を付けることで、トップレベルにあるExampleクラスを呼び出してくれました。

参考

https://spirits.appirits.com/doruby/12105/?cn-reloaded=1

返信がありません

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です