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

时间:2012-06-03 11:17:59

标签: ruby syntax computer-science

背景

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

Ruby manualexpression substitution一节中提到了这个语法元素,但没有真正定义语法本身的术语。几乎每个对这个语言元素的引用都表示它使用进行字符串插值,但没有定义的内容。

维基百科定义

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

  1. Literal (computer programming)
  2. Operator (programming)
  3. 问题

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

4 个答案:

答案 0 :(得分:7)

Ruby的解析器调用#{}“ embexpr ”运算符。这自然就是EMBedded EXPRession。

答案 1 :(得分:3)

我绝对称之为文字(更多的是,例如字符串文字数字文字本身,而不是其中的部分),也不是运算符;这些仅用于例如二元或一元(中缀)运算符。

我或者只是在没有名词的情况下引用它(即用于字符串插值),或者可能将这些字符称为字符串插值序列或转义。

答案 2 :(得分:3)

TL; DR

最初,我假设:

  根据源代码中的提示,

嵌入式表达式似乎是此令牌最可能的定义。

事实证明这是真的,并且已经由Ruby 2.x文档正式验证。根据最初编写此答案后Ripper documentation的更新,似乎解析器令牌正式定义为string_embexpr,符号本身称为“嵌入式表达式”。请参阅本答案底部的 Ruby 2.x更新部分,以获得详细的确证。

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

2.x之前的答案基于Ruby 1.9.3源代码

相关答案

This answer提醒注意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 bison文件的第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类的文档已经更新,以正式识别令牌。 usage section"Hello, #{world}!"为例,部分说明:

  

在我们的:string_literal中,您会注意到两个@tstring_content,这是Hello,!的文字部分。两个@tstring_content语句之间是:string_embexpr,其中 embexpr 是嵌入式表达式。

答案 3 :(得分:0)

这个Block帖子暗示,它被称为'成语': http://kconrails.com/2010/12/08/ruby-string-interpolation/

维基百科文章似乎与此并不矛盾: http://en.wikipedia.org/wiki/Programming_idiom