在 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
创建一个每次都必须进行垃圾收集的新字符串,或者是否有类似内部写时复制优化的东西,它使用对实习表示的引用直到对字符串进行突变之前的符号?