8

今日の午後、アイデアで遊んでいたのですが、よくわからないことがありました。基本的に、この実験で私が達成しようとしているのは、文字列が作成されるたびに(ある種の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"

文字列がリテラルの場合、コンパイラは何か別のことをしていることに気付きましたが、完全に機能するオブジェクトにするために、初期化する必要はありませんか?リテラルを使用して文字列がいつ作成されるかを判断するために使用できるトリックはありますか、それとも不可能ですか?

ありがとう!

4

1 に答える 1

1

Chris Heald が目を覚まし、彼が約束したようにそのソース コードを実際に見ない限り、ここでの議論から、ここにいる誰もあなたに本当の答えを与えることはほとんどないと思います。しかし、あなたの質問へのコメントであなたが言っているように、目的が「言語が何か新しいことを学ぶためにできることの境界をテストする」ことである場合は、SlideShare が嫌いですが、紹介させてください。この Ruby プレゼンテーションは、有名な難解プログラマー遠藤祐介氏によるものです。

于 2012-10-30T18:25:36.637 に答える