最初に
タイトル通りですが、initializeという特別なメソッドの可視性について書いてます。
断りのない限り、Ruby3.1.2で2022年10月に再検証してます。
(ところで、可視性って言葉があまりしっくりこないです。気が向いたら、他によい言葉がないか調べます。)
特別なinitialize
initializeは特別なメソッドとして扱われるので、
何も指定しなくても、
publicやprotecdの配下に置いても
initializeはprivateメソッドのままになる。
class Public 
  public
    def initialize
    end
end
p Public.new.private_methods.include?(:initialize)   #=> true
p Public.new.public_methods.include?(:initialize)    #=> false
p Public.new.protected_methods.include?(:initialize) #=> false
p Public.new.methods.include?(:initialize)           #=> false
class Protected
  protected
    def initialize
    end
end
p Protected.new.private_methods.include?(:initialize)   #=> true
p Protected.new.protected_methods.include?(:initialize) #=> false
p Protected.new.public_methods.include?(:initialize)    #=> false
p Protected.new.methods.include?(:initialize)           #=> false
ただし、Ruby技術者認定試験Goldの勉強をしてる人は、
protectedについて注意が必要である。
2.1の頃は、バグか何かで、protecdの配下にあるとprotectedメソッドになってしまう。
RExの練習問題はまだ2.1で出題されてると思うので、気をつけた方がいい。
2.3の頃には、privateのままで、protectedに変更できなくなっていた。
引数の形で取ると
余談
また、publicもprotectedもメソッドであり、
あえてシンボルの:initializeを引数にとると、
ちゃんとinitializeメソッドが変更される。
class Public
  public :initialize
end
p Public.new.private_methods.include?(:initialize)   #=> false
p Public.new.public_methods.include?(:initialize)    #=> true
p Public.new.protected_methods.include?(:initialize) #=> false
p Public.new.methods.include?(:initialize)           #=> true
p Public.new.initialize #=> nil
class Protected
  protected :initialize
end
p Protected.new.private_methods.include?(:initialize)   #=> false
p Protected.new.public_methods.include?(:initialize)    #=> false
p Protected.new.protected_methods.include?(:initialize) #=> true
p Protected.new.methods.include?(:initialize)           #=> true