せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】リテラルって「そのまま」ということ

リテラルっていまいちぴんと来ないとぼやいていたら師匠からメールが来た

リテラルって、直訳でいうと、書いてあるとおりの値って意味ね。
例えば、変数xがあって、この値は何か?一意には決まらんよね。あるいは、関数の引数を考えよう。関数だけをみて、その変数の値が決定できるか?無理よね。
こういう変数の値は、環境とセットになって値がきまる。だから環境が変われば値も変わる。
これに対して、リテラルはそうじゃない。リテラルは環境によらない。1もリテラルやけど、1は環境によらず、1の値を表現するよね。こんなふうに見たままの値を表現するのがリテラル

ふーむなるほど。
携帯にこれ以上長文メールを送られないためにも、
さっそく確かめよう。

改めて、公式ガイド「リテラル」を見返してみよう
http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fliteral.html

うーん。確かに
1
"hoge"
などはおっしゃるとおりだけど、

「式展開」もリテラルの章に入ってるよ?
"my name is #{$ruby}" はリテラルの範疇みたいだよ?

たぶんこれは「リテラル記法」(この場合はダブルクオテーションで囲まれた表現)
によって式展開が表現されているから。

 
『初めてのRuby』にはこうある。

要素をそのまま(literally)並べて角括弧[]でくくれば、
それらを要素とする配列が構築されます。
(例)c は配列リテラル
c = [a, b, "hoge"]

そのまま書ける、ってところがポイントなのかな。
例えばオブジェクトであれば

a = Hoge.new

と作成するのであって、そのまま表記、ではない。

配列も

c = Array[1, 2, 3]

と作ったら、リテラルではない。
あくまで「配列式」がリテラルなだけ。

これ以上の深堀はいいか。

 
(10月24日追記)
Rubyオライリー本にはこう書いてあります

数値などの多くのリテラルが、それ以上単純な式には分割できない。しかし、配列、ハッシュリテラルや式展開を含むダブルクオート文字列などは内部に更に式を含んでおり、このような性質を満たさない

 
なるほど。
リテラルだから完全に実行時の値が明確化されている」とは限らないんだ。
内部に式を含んでいる限り、リテラルでも、実行時の値は(実行するまで)分からない。

リテラル記法ができる かつ 値が明確化されている
リテラル記法ができる かつ 値が明確化されない

リテラルにはこの2種類が存在するんだ。