Quantcast
Channel: hachi8833の記事一覧|TechRacho by BPS株式会社
Viewing all articles
Browse latest Browse all 1841

Ruby: `new`を使わずにクラスのinitializeを実行してみる

$
0
0

やってみたらできました。業務では使う意味がないというか使わないでください。

class Foo
  def initialize
    @a = 1
    @b = 2
  end

  def inspect
    puts @a
    puts @b
  end
end

簡単のため、上のinitializeには引数もブロックも渡していません。

以下は普通にnewした場合です。

» a = Foo.new
1
2
» a.inspect
1
2

allocatetapsendでやる

  • Class#allocateを使うと、initializeを呼び出さずにインスタンスを生成できる
  • initializeメソッドはprivateなので、send(:initialize)で無理やり呼び出す
  • tapを使ってsend(:initialize)のブロックをねじ込む
» a = Foo.allocate.tap {|i| i.send(:initialize) }
1
2
#»
» a.class
#» Foo
» a.inspect
1
2

参考: instance method Class#allocate (Ruby 2.6.0)
参考: instance method Object#tap (Ruby 2.6.0)
参考: instance method Object#__send__ (Ruby 2.6.0)

Rubyのinitializeメソッドは特殊

Rubyのinitializeメソッドは、普通のインスタンスメソッドのような形をしていながら、例外的にprivateメソッドにされます。

» Foo.initialize
NoMethodError: private method `initialize' called for Foo:Class
from (pry):14:in `__pry__'

参考: instance method Object\#initialize (Ruby 2.6.0)

initialize という名前のメソッドは自動的に private に設定されます。
docs.ruby-lang.orgより

関連記事

Rubyのオブジェクト作成方法を改変する(翻訳)


Viewing all articles
Browse latest Browse all 1841

Trending Articles