これは何?
Ruby で public な static メソッドから、private なインスタンスメソッドを呼び出す方法について調べました。
確認環境
$ ruby --version
ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-darwin19]
実装
sample.rb
class Sample
def self.public_static_method
p "#{__method__} start"
ins = new
# NOTE: この呼び出しだとprivateメソッドはレシーバーを指定できないためエラーになる
# ins.private_instance_method
ins.send(:private_instance_method)
p "#{__method__} end"
end
private
def initialize
p "#{__method__} start"
p "#{__method__} end"
end
def private_instance_method
p "#{__method__} start"
p "#{__method__} end"
end
private_class_method :new
end
p 'public static method'
Sample.public_static_method
p '--- インスタンス化を防ぐ ---'
Sample.new
$ ruby sample.rb
"public static method"
"public_static_method start"
"initialize start"
"initialize end"
"private_instance_method start"
"private_instance_method end"
"public_static_method end"
"--- インスタンス化を防ぐ ---"
Traceback (most recent call last):
private-receiver.rb:30:in `<main>': private method `new' called for Sample:Class (NoMethodError)
おわりに
最初、外から new させたくないので、public な static メソッドにしていました。
しかし、public なメソッドが増えることを考えると外で new しても良いのではないかと思い直しました。
ins = Sample.new(key1, key2)
ins.public_method1
ins.public_method2
ということで終わりです。