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

标签 ruby internals

今天下午我在玩一个主意,偶然发现了一些我不太明白的东西。基本上我在这个实验中试图实现的是在每次创建字符串时以某种方式知道(供以后使用,例如在某种 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/

相关文章:

ruby - 替换 Ruby 字符串中所有出现的 ",NULL,"

mysql - 为什么当我向表中添加数据时,包含我表数据的 MySQL 文件的大小没有改变?

ruby - ubuntu中不同版本的ruby

javascript - 为什么现代浏览器 JS 引擎是多线程的?

php - PHP 的列表函数是如何工作的?

ruby - object_id 分配如何工作?

java - JVM 如何实现可变参数?

ruby-on-rails - 如何验证为 Rails 应用程序中的所有路由定义了 Controller 操作?

sql - Ruby NoMethodError - BlahController 的未定义方法 `blah_url'

ruby-on-rails - Ruby on Rails - 链接两个模型