10

的背景

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

Ruby 手册表达式替换部分提到了这个语法元素,但并没有真正定义语法本身的术语。几乎所有对这种语言元素的引用都说它用于字符串插值,但没有定义它什么。

维基百科定义

以下是一些 Wikipedia 定义,暗示此构造(严格来说)既不是文字也不是运算符。

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

问题

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

4

5 回答 5

7

Ruby 的解析器调用 #{} 的“ embexpr ”运算符。这自然是嵌入式表达。

于 2012-06-04T00:18:12.370 回答
3

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

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

于 2012-06-03T13:23:56.583 回答
3

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.yripper.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}的测试。测试同时引用了embexprexpr,增加了“嵌入式表达式”确实是该事物的合理名称的可能性。

Ruby 2.x 更新

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

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

于 2012-06-04T14:39:10.400 回答
0

这个块帖子建议,它被称为“成语”: http: //kconrails.com/2010/12/08/ruby-string-interpolation/

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

于 2012-06-04T09:56:10.533 回答
-1

#{} 称为占位符,用于用字符串引用变量。放“我的名字是#{my_name}”

于 2021-09-22T01:47:57.203 回答