Rubyにおける定数は、他言語と比較して異なる点があるため、最初は戸惑うかもしれません。しかし、Rubyに親しんでいるうちに気にならなくなるでしょう。
定数を定義するときは、左辺に大文字から始まる定数名を置き、右辺に定義するオブジェクトを置き、それらをイコール記号で結びます。
[1] pry(main)> QUEEN = 42 => 42 [2] pry(main)> QUEEN => 42
大文字から始まれば「定数だ」と認識されるので、以下のような場合でも、「Queen」は定数とみなされます。
[3] pry(main)> Queen = 12 => 12 [4] pry(main)> Queen => 12
また、警告は出ますが、定数は再定義できます。Rubyにおける定数は、定数というよりも「特別な種類の変数だ」と考えた方がよいでしょう。
[5] pry(main)> > KING = 13 => 13 [6] pry(main)> KING = 42 (pry):6: warning: already initialized constant KING (pry):5: warning: previous definition of KING was here => 42 [7] pry(main)> KING => 42
警告は「KINGはすでに定数として定義されていますよ、5行目にKINGの定義があります」と教えてくれています。
また、freezeメソッドを使うことで、定数を後から変更できないようにする(凍結)ことができます。オブジェクトが凍結されると、オブジェクトそのもののデータを変更するようなメソッドを使えなくなります。
[7] pry(main)> TEAPOT = "tea".freeze => "tea" [8] pry(main)> TEAPOT.capitalize! RuntimeError: can't modify frozen String from (pry):7:in `capitalize!'
この例では、「tea」という文字列オブジェクトを凍結したものを定数「TEAPOT」に代入しています。「capitalize!」メソッドは、オブジェクト自身の文字列を全て大文字に変えるメソッドですが、凍結されているので失敗します。
ただし以下の例のように、凍結されたオブジェクトを指している変数に新しく作ったオブジェクトを設定すること、つまり再代入は可能なので注意してください。
[9] pry(main)> TEAPOT = "coffee" (pry):8: warning: already initialized constant TEAPOT (pry):6: warning: previous definition of TEAPOT was here => "coffee"
定数について、まつもとゆきひろ氏の考え方はメーリングリストのログから読み取ることができます。
以下のキーワードは言語的に「予約」されているので、クラス名や変数名として使うことはできません。「@」「@@」を接頭語として付与し、インスタンス変数やクラス変数として使うことはできますが、ここでは基本的に使えないものと思ってください。
BEGIN class ensure nil self when END def false not super while alias defined? for or then yield and do if redo true __LINE__ begin else in rescue undef __FILE__ break elsif module retry unless __ENCODING__ case end next return until
リテラルとは、Rubyの「プログラムに直接書ける値」のことです。ここからは、主要なリテラルについて一通り解説します。
素直に10進数で数値を書けば、それは10進数の整数として扱われます。
[1] pry(main)> 42 => 42
また、マイナス記号を付けて負の整数を表現することもできます。
[2] pry(main)> -42 => -42
アンダースコアで区切りを付けて、読みやすくすることもできます。
[3] pry(main)> 42_000_000 => 42000000
10進数以外にも、2進数、8進数、16進数を用いて整数を表現できます。以下は、いずれも10進数で表現した場合に「42」を表す整数の例です。
[4] pry(main)> 0b101010 => 42
[5] pry(main)> 052 => 42
[6] pry(main)> > 0x2A => 42
実数は、小数点を使って表現する方法と、指数部と仮数部を使って表現する方法とがあります。以下は、いずれも4.2を表す実数の例です。
[7] pry(main)> > 4.2 => 4.2 [8] pry(main)> 42e-1 => 4.2 [9] pry(main)> 0.42e+1 => 4.2
Ruby 2.1.0から、有理数を表現するためのリテラルが追加されました。例えば、「1/3」(3分の1)という分数を表現したい場合、以下のように書けます。
[10] pry(main)> 1/3r => (1/3)
有理数は無限小数や循環小数を正確に表現できるので、以下の乗算の結果は「1/1」(1分の1)、つまり「1」になります。
[11] pry(main)> 1/3r * 3 => (1/1)
Ruby 2.1.0から、複素数を表現するためのリテラルが追加されました。例えば、虚部に42という値を持つ複素数を表現したい場合、以下のように書けます。
[12] pry(main) 42i => (0+42i)
もちろん、実部も含めて複素数を表現することも可能です。以下の例では、実部に「5」、虚部に「42」という値を持つ複素数を表現しています(正確には、「5」という整数に、「42i」というリテラルで表した複素数を足し合わせています)。
[13] pry(main)> 5 + 42i => (5+42i)
また、虚数部に有理数を持つような複素数も書けます。
[14] pry(main)> 42ri => (0+(42/1)*i)
Copyright © ITmedia, Inc. All Rights Reserved.