在MRI中,似乎rb_id2str()负责在您打电话时完成所有工作Symbol#to_s.我惊讶地发现这是一个非常神秘的功能,我认为这是一个相当直接的操作.
我正在寻找这个函数正在做什么的详细解释.作为参考,这里是1.9.3中源代码的链接:
http://rxr.whitequark.org/mri/source/parse.y?v=1.9.3-p195#9950
一些具体问题:
四大if块在做什么?
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/
| 归档时间: |
|
| 查看次数: |
269 次 |
| 最近记录: |