今天下午我在玩一个想法,偶然发现了一些我不太明白的东西。基本上,我在这个实验中想要实现的是以某种方式知道每次创建字符串时(供以后使用,例如在某种 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"
我意识到当字符串是文字时编译器正在做一些不同的事情,但它不需要初始化,只是为了成为一个功能齐全的对象吗?是否有任何技巧可以用来确定何时使用文字创建字符串,或者这是不可能的?
谢谢!