- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
在 MRI 中,似乎 rb_id2str()
当您调用 Symbol#to_s
时负责完成所有工作.我惊讶地发现这是一个极其神秘的函数,而我认为这是一个相当直接的操作。
我正在寻找有关此功能的详细说明。作为引用,这里是 1.9.3 中源代码的链接:
http://rxr.whitequark.org/mri/source/parse.y?v=1.9.3-p195#9950
一些具体问题:
什么是四大if
block 在做什么?
if (id < tLAST_TOKEN)
if (id < INT_MAX && rb_ispunct((int)id))
if (st_lookup(global_symbols.id_str, id, &data))
if (is_attrset_id(id))
如果能大致了解 if 语句中每个代码块的作用,那将是很棒的,但不需要逐行分析。
最后,我对 to_s
的内存/垃圾收集影响感到好奇: 调用 Symbol#to_s
创建一个每次都必须被垃圾收集的新字符串,或者是否有类似内部写时复制优化的东西,它使用对符号的内部表示的引用,直到对字符串进行突变?
最佳答案
一方面,我很确定 Symbol#to_s 创建了一个新字符串。大多数 ruby 类都是 C 结构,除了 TrueClass、FalseClass、NilClass、Fixnum 和 Symbol,它们在 C 中是 int。所以 Symbol 与 String 完全不同(这就是为什么推荐使用 Symbol,除非你需要大量更改值) .
我不确定你是否知道 Ruby Hacking Guide 这本书,它解释了很多关于如何在 C 中实现 MRI 的内容。
仅供引用,Ruby Hacking Guide 是用日文写的,到现在只有一小部分被翻译了,看来大家已经放弃了。 http://rhg.rubyforge.org/
关于ruby - MRI 内部结构 : detailed explanation of rb_id2str,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13280806/
我是一名优秀的程序员,十分优秀!