ruby中的字符串文字如何绕过new/initialize,有没有办法对此进行检测?

Mas*_*oud 8 ruby internals

今天下午我正在玩一个想法,偶然发现了一些我不太懂的东西.基本上我在这个实验中想要实现的是以某种方式知道每次创建一个字符串(以供以后使用,例如在某种DSL中).以下适用于通过String.new创建的任何String:

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
Run Code Online (Sandbox Code Playgroud)

例如

irb > String.new("foo")
initializing 'foo'
newing 'foo'
 => "foo"
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚当你使用文字时如何创建一个String对象.例如,为什么不进行相同的初始化和设置:

irb > "literal string"
 => "literal string"
Run Code Online (Sandbox Code Playgroud)

我意识到当字符串是文字时,编译器正在做某事或其他不同的事情,但它不是需要初始化,只是作为一个功能齐全的对象?是否有任何技巧可以用来确定何时使用文字创建字符串,或者这是不可能做到的?

谢谢!

Bor*_*cky 1

我认为从接下来的讨论来看,这里几乎没有人会给你真正的答案,除非克里斯·希尔德醒来并像他承诺的那样实际查看源代码。但是,如果正如您在对问题的评论中所说,目的是“测试该语言可以做的事情的界限,以获得一些乐趣并学习新的东西”,那么让我向您介绍 - 尽管我讨厌 SlideShare -这是著名深奥程序员 Yusuke Endoh 的 Ruby 演示