意外と知らない小ネタ
Rubyのクラスメソッドをprivate化する際に以下のような宣言の仕方だとうまくprivate化されず、
class Hoge
private
def self.hoge
puts 'hoge'
end
end
Hoge.hoge
実行結果は
hoge
となってしまいます。
原理は詳しくはソースを読んでみないとわからないんですがおそらくprivate下に書いても、self.hoge
のように書いてしまうとクラスメソッドとして定義されてしまうんだろうなと・・
ではどう描く?ですが
class Hoge
def self.hoge
puts 'hoge'
end
private_class_method :hoge
end
Hoge.hoge
実行結果は・・
hoge.rb:13:in `<main>': private method `hoge' called for
Hoge:Class (NoMethodError)
ERROR: 1
きちんとprivate化されていますね!
個人的にはこれが好み、要はself.としなければいい
class Hoge
class << self
private
def hoge
puts 'hoge'
end
end
end
Hoge.hoge
こちらもうまくprivate化できていますね
hoge.rb:14:in `<main>': private method `hoge' called for
Hoge:Class (NoMethodError)
ERROR: 1
コメント