【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種類が存在するんだ。