我最近发布了an answer,其中我不同地将#{}
称为文字,操作符,并且(在一个草稿中)称为“文字构造函数”。这个定义的松软并没有真正影响答案的质量,因为问题更多的是关于它的作用以及如何为它找到语言参考,但我不满意无法指出准确的规范定义什么叫做Ruby语法的这个元素。
Ruby manual在expression substitution一节中提到了这个语法元素,但没有真正定义语法本身的术语。几乎每个对这个语言元素的引用都表示它使用进行字符串插值,但没有定义是的内容。
以下是维基百科的一些定义,暗示这种结构(严格来说)既不是文字也不是运营商。
有谁知道这个语言元素的正确用语是什么?如果是这样,你能指点一个正式的定义吗?
答案 0 :(得分:7)
Ruby的解析器调用#{}“ embexpr ”运算符。这自然就是EMBedded EXPRession。
答案 1 :(得分:3)
我绝对称之为文字(更多的是,例如字符串文字或数字文字本身,而不是其中的部分),也不是运算符;这些仅用于例如二元或一元(中缀)运算符。
我或者只是在没有名词的情况下引用它(即用于字符串插值),或者可能将这些字符称为字符串插值序列或转义。
答案 2 :(得分:3)
最初,我假设:
根据源代码中的提示,嵌入式表达式似乎是此令牌最可能的定义。
事实证明这是真的,并且已经由Ruby 2.x文档正式验证。根据最初编写此答案后Ripper documentation的更新,似乎解析器令牌正式定义为string_embexpr
,符号本身称为“嵌入式表达式”。请参阅本答案底部的 Ruby 2.x更新部分,以获得详细的确证。
答案的其余部分仍然相关,特别是对于像Ruby 1.9.3这样的旧Rubies,用于开发原始答案的方法仍然很有趣。因此,我正在更新答案,但保留原始帖子的大部分用于历史目的,即使当前答案现在可能更短。
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 ,提高了“嵌入式表达式”确实是该事物的合理名称的可能性。
由于这篇文章最初编写,标准库的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