今日の午後、アイデアで遊んでいたのですが、よくわからないことがありました。基本的に、この実験で私が達成しようとしているのは、文字列が作成されるたびに(ある種のDSLなどで後で使用するために)何らかの方法で知ることです。以下は、String.newを介して作成されたすべての文字列に対して正常に機能します。
class ::String
class << self
alias_method :new_orig, :new
def new(*args)
o = new_orig(*args)
puts "newing '#{o}'"
o
end
end
alias_method :initialize_orig, :initialize
def initialize(*args)
initialize_orig(*args)
puts "initializing '#{self}'"
end
end
例えば
irb > String.new("foo")
initializing 'foo'
newing 'foo'
=> "foo"
私が理解できないのは、リテラルを使用したときにStringオブジェクトがどのように作成されるかです。たとえば、これが同じ初期化とセットアップを行わないのはなぜですか。
irb > "literal string"
=> "literal string"
文字列がリテラルの場合、コンパイラは何か別のことをしていることに気付きましたが、完全に機能するオブジェクトにするために、初期化する必要はありませんか?リテラルを使用して文字列がいつ作成されるかを判断するために使用できるトリックはありますか、それとも不可能ですか?
ありがとう!