今天下午我在玩一个主意,偶然发现了一些我不太明白的东西。基本上我在这个实验中试图实现的是在每次创建字符串时以某种方式知道(供以后使用,例如在某种 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"
我意识到当字符串是文字时,编译器会做一些不同的事情,但它不需要初始化,只是为了成为一个功能齐全的对象吗?是否可以使用任何技巧来确定何时使用文字创建字符串,或者这是不可能的?
谢谢!
最佳答案
我认为从接下来的讨论来看,这里几乎没有人会给你真正的答案,除非 Chris Heald 醒来并按照他的 promise 实际查看源代码。但是,如果正如您在对问题的评论中所说,目的是“测试语言可以做什么来获得乐趣和学习新东西的界限”,那么让我向您介绍 - 尽管我很讨厌 SlideShare - this Ruby presentation by famous esoteric programmer Yusuke Endoh .
关于ruby - ruby 中的字符串文字如何绕过 new/initialize,有没有办法对此进行检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13128510/