TL;博士
最初,我假设:
根据源代码中的提示,嵌入式表达式似乎是此标记最可能的定义。
事实证明这是真的,并且已经被 Ruby 2.x 文档正式验证。根据自最初编写此答案以来对Ripper 文档string_embexpr
的更新,似乎解析器标记被正式定义为,并且符号本身被称为“嵌入式表达式”。有关详细证实,请参阅此答案底部的Ruby 2.x 更新部分。
答案的其余部分仍然相关,特别是对于 Ruby 1.9.3 等较旧的 Ruby,用于开发原始答案的方法仍然很有趣。因此,我正在更新答案,但出于历史目的保留大部分原始帖子,即使当前答案现在可能更短。
基于 Ruby 1.9.3 源代码的 Pre-2.x 答案
相关答案
这个答案引起了对 Ruby 源代码的关注,它在整个代码库中多次引用了embexpr 。@Phlip 建议这个变量是“EMBedded EXPRession”的缩写。这似乎是一个合理的解释,但是 ruby-1.9.3-p194 源代码和 Google(在撰写本文时)都没有在任何上下文中明确引用与embexpr相关的术语嵌入表达式,无论是否与 Ruby 相关。
额外研究
对 Ruby 1.9.3-p194 源代码的扫描:
ack-grep -cil --type-add=YACC=.y embexpr .rvm/src/ruby-1.9.3-p194 |
sort -rnk2 -t: |
sed 's!^.*/!!'
显示 9 个文件和 33 行,其中包含embexpr 一词:
test_scanner_events.rb:12
test_parser_events.rb:7
eventids2.c:5
eventids1.c:3
eventids2table.c:2
parse.y:1
parse.c:1
ripper.y:1
ripper.c:1
特别令人感兴趣的是在parse.y和ripper.y野牛文件的第 4,176 行包含string_embexpr 。同样,TestRipper::ParserEvents#test_string_embexpr 在 test_parser_events.rb的第 899 行和第 902 行包含对解析#{}的两个引用。
在test_scanner_events.rb中使用的扫描器也值得注意。该文件在#test_embexpr_beg和#test_embexpr_end中定义了在各种字符串表达式中扫描标记#{expr}的测试。测试同时引用了embexpr和expr,增加了“嵌入式表达式”确实是该事物的合理名称的可能性。
Ruby 2.x 更新
由于这篇文章最初是写的,标准库的 Ripper 类的文档已经更新以正式识别令牌。用法部分提供了"Hello, #{world}!"
一个示例,并部分说明:
在我们的内容中,:string_literal
您会注意到两个@tstring_content
,这是Hello,
and的字面部分!
。两个@tstring_content
语句之间是一个:string_embexpr
,其中embexpr是一个嵌入的表达式。