Code Journey

30代未経験からプログラミング挑戦中(追うものは追われる者に勝る)

Rubyでクラスメソッドをprivateしても呼び出せるので注意が必要

はじめに

私は現在、フィヨルドブートキャンプで、未経験からプログラミング学習をしているものになります。

この記事は、自分自身が学習したことをまとめ、アウトプットすることを目的として書いていますので、間違いがある可能性がありますのでご注意ください。

classでprivate以下に記述したとしてもクラスメソッドはprivateにならない

Rubyでクラス内にprivateを記述し、その配下にクラスメソッドを定義しても外部から呼び出せてしまうので注意が必要です。

class Cat
  private
  
  def self.hello
    'meow'
  end
end

Cat.hello #=> "meow"

このように呼び出せてしまいました。

privateメソッドが有効なのはインスタンスメソッドだけです。

クラスメソッドをprivateの範囲にいれるには2つ方法があります。

方法1:class << self構文を使う

class Cat
  class << self
    private

    def hello
      'meow'
    end
  end
end

Cat.hello #=> private method `hello' called for Cat:Class (NoMethodError)

方法2: private_class_methodを使う

class Cat
  def self.hello
    'meow'
  end
  private_class_method :hello
end

Cat.hello #=> private method `hello' called for Cat:Class (NoMethodError)

クラスメソッドを定義した後にpraivate_class_methodでprivateのメソッドを指定します。

意図しないメソッドの可視性に注意したい

自分で呼び出せると思っていた範囲以上にメソッドが呼び出せてしまうのは意図しないエラーやトラブルにつながる可能性もあるので基礎知識として知っておかなければならないことを勉強していて改めて感じました!

日々勉強ですね🔥