最初に
タイトル通りですが、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