publicなstaticメソッドからprivateなインスタンスメソッド呼ぶ (Ruby)

March 14, 2022

これは何?

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

ということで終わりです。


SHARE

Profile picture

Written by tamesuu