10

背景

私は最近、リテラル、演算子、および(1つのドラフトでは)「リテラルコンストラクター」とさまざまに呼んでいる回答を投稿しました。#{}質問はそれが何をするのか、そしてそれの言語参照を見つける方法についてだったので、この定義のスクイーズは実際には答えの質に影響を与えませんでしたが、正確に正規の定義を指すことができないことに不満がありますRuby構文のこの要素を何と呼ぶか​​。

Rubyのマニュアルでは、式の置換に関するセクションでこの構文要素について言及していますが、構文自体の用語は実際には定義されていません。この言語要素へのほとんどすべての参照は、文字列補間に使用されると言っていますが、それ何であるかを定義していません。

ウィキペディアの定義

これは、この構成が(厳密に言えば)リテラルでも演算子でもないことを意味するウィキペディアの定義です。

  1. リテラル(コンピュータープログラミング)
  2. オペレーター(プログラミング)

質問

この言語要素の適切な用語が何であるかを誰かが知っていますか?もしそうなら、正式な定義を教えていただけますか?

4

5 に答える 5

7

Ruby のパーサーは #{} を「embexpr」演算子として呼び出します。当然、EMBedded EXPRession です。

于 2012-06-04T00:18:12.370 に答える
3

私は間違いなくそれをリテラル(たとえば、文字列リテラル数値リテラル自体ではありますが、その一部ではありません)でも演算子でもありません。これらは、たとえば2進または単項(中置)演算子専用です。

名詞なしで(つまり、文字列補間のために)それを参照するか、おそらくそれらの文字を文字列補間シーケンスまたはエスケープと呼びます。

于 2012-06-03T13:23:56.583 に答える
3

TL;DR

当初、私は次のような仮説を立てていました。

ソース コードのヒントに基づいて、埋め込み式がこのトークンの最も可能性の高い定義のようです。

これは事実であることが判明し、Ruby 2.x のドキュメントによって公式に検証されました。この回答が最初に書かれた後のRipper ドキュメントの更新に基づいて、パーサートークンは正式に定義されているようstring_embexprで、シンボル自体は「埋め込み式」と呼ばれます。詳細な確証については、この回答の下部にある「Ruby 2.x の更新」セクションを参照してください。

回答の残りの部分は、特に Ruby 1.9.3 などの古い Ruby に関連しており、元の回答を開発するために使用された方法論は依然として興味深いものです。したがって、回答を更新していますが、現在の回答は短くなる可能性がありますが、歴史的な目的のために元の投稿の大部分をそのまま残しています。

Ruby 1.9.3 ソースコードに基づく 2.x 以前の回答

関連する回答

この回答は、コード ベース全体でembexprを多数参照している Ruby ソースに注意を促します。@Phlip は、この変数が「EMBedded EXPRession」の略語であることを示唆しています。これは合理的な解釈のように思えますが、ruby-1.9.3-p194 のソースも Google (この記事の執筆時点)も、Ruby に関連するかどうかに関係なく、embexprに関連して埋め込み式という用語を明示的に参照していません。

追加研究

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!^.*/!!'

mbexprという用語を含む 9 つのファイルと 33 行が表示されます。

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 行目に#{}の解析への 2 つの参照が含まれています。

test_scanner_events.rbで実行されるスキャナーも注目に値します。このファイルは、さまざまな文字列式内のトークン#{expr}をスキャンする#test_embexpr_begおよび#test_embexpr_endのテストを定義します。テストはembexprexprの両方を参照しており、「埋め込み式」が実際に意味のある名前である可能性が高くなります。

Ruby 2.x の更新

この投稿が最初に書かれて以来、標準ライブラリの Ripper クラスのドキュメントが更新され、正式にトークンが特定されました。使用法セクションは例として提供"Hello, #{world}!"し、一部は次のように述べています。

これはとのリテラル部分:string_literalです。2 つのステートメントの間には、embexprが埋め込まれた式です。@tstring_contentHello,!@tstring_content:string_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 に答える