LoginSignup
5
1

More than 1 year has passed since last update.

Rubyのinitializeの可視性の変更

Last updated at Posted at 2022-01-14

最初に

タイトル通りですが、initializeという特別なメソッドの可視性について書いてます。
断りのない限り、Ruby3.1.2で2022年10月に再検証してます。

(ところで、可視性って言葉があまりしっくりこないです。気が向いたら、他によい言葉がないか調べます。)

特別なinitialize

initializeは特別なメソッドとして扱われるので、
何も指定しなくても、
publicprotecdの配下に置いても
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に変更できなくなっていた。

引数の形で取ると

余談

また、publicprotectedもメソッドであり、
あえてシンボルの: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
5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1