Ruby语法中"#{}"标记的正式术语是什么?

Tod*_*obs 10 ruby syntax computer-science

的背景

我最近发布了一个答案,其中我不同地称为#{}文字,操作符和(在一个草稿中)"文字构造函数".这个定义的松软并没有真正影响答案的质量,因为问题更多的是关于它的作用以及如何为它找到语言参考,但我不满意无法指出准确的规范定义什么叫做Ruby语法的这个元素.

红宝石手册提到在上一节该语法元素表达替代,但并没有真正定义了语法本身的术语.几乎每一个参考这个语言元素表示,它使用串插,但不定义它是什么.

维基百科定义

以下是维基百科的一些定义,暗示这种结构(严格来说)既不是文字也不是运算符.

  1. 文字(计算机编程)
  2. 操作员(编程)

问题

有谁知道这个语言元素的正确用语是什么?如果是这样,你能指点一个正式的定义吗?

Phl*_*lip 7

Ruby的解析器调用#{}" embexpr "运算符.那就是EMBedded EXPRession,很自然.


Tod*_*obs 3

长话短说

\n\n

最初,我假设:

\n\n
\n

嵌入表达根据源代码中的提示,

\n
\n\n

事实证明这是真的,并且已经得到 Ruby 2.x 文档的正式验证。根据自该答案最初编写以来对Ripper 文档的更新,解析器标记似乎被正式定义为,string_embexpr并且符号本身被称为“嵌入表达式”。请参阅Ruby 2.x 的更新本答案底部的

\n\n

答案的其余部分仍然相关,特别是对于较旧的 Ruby,例如 Ruby 1.9.3,并且用于开发原始答案的方法仍然很有趣。因此,我正在更新答案,但出于历史目的保留原始帖子的大部分内容,即使当前答案现在可能更短。

\n\n

基于 Ruby 1.9.3 源代码的 Pre-2.x 答案

\n\n

相关答案

\n\n

这个答案引起了对 Ruby 源代码的关注,它在整个代码库中大量引用了embexpr 。@Phlip 建议该变量是“EMBedded EXPRession”的缩写。这似乎是一个合理的解释,但 ruby​​-1.9.3-p194 源代码和 Google(截至撰写本文时)都没有在任何上下文中明确引用与embexpr相关的术语嵌入式表达式,无论是否与 Ruby 相关。

\n\n

额外的研究

\n\n

扫描 Ruby 1.9.3-p194 源代码:

\n\n
ack-grep -cil --type-add=YACC=.y embexpr .rvm/src/ruby-1.9.3-p194 |\n    sort -rnk2 -t: |\n    sed \'s!^.*/!!\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

显示 9 个文件和 33 行,其中包含术语embexpr

\n\n
test_scanner_events.rb:12\ntest_parser_events.rb:7\neventids2.c:5\neventids1.c:3\neventids2table.c:2\nparse.y:1\nparse.c:1\nripper.y:1\nripper.c:1\n
Run Code Online (Sandbox Code Playgroud)\n\n

特别令人感兴趣的是在parse.yripper.y bison 文件的第 4,176 行包含string_embexpr。同样,TestRipper::ParserEvents#test_string_embexpr在test_parser_events.rb的第 899 行和第 902 行包含两个对解析#{}的引用。

\n\n

在test_scanner_events.rb中使用的扫描器也值得注意。此文件在#test_embexpr_beg#test_embexpr_end中定义测试,扫描各种字符串表达式内的标记#{expr}。这些测试引用了embexprexpr,这提高了“嵌入表达式”确实是该事物的合理名称的可能性。

\n\n

Ruby 2.x 更新

\n\n

自从这篇文章最初撰写以来,标准库的 Ripper 类的文档已更新以正式标识令牌。用法部分提供了"Hello, #{world}!"一个示例,并部分说明:

\n\n
\n

在我们的:string_literalyou\xe2\x80\x99 中,你会注意到两个,这是和@tstring_content的文字部分。两个语句之间是 a ,其中embexpr是嵌入表达式。Hello,!@tstring_content:string_embexpr

\n
\n