連載
» 2014年03月27日 18時00分 公開

Ruby 2.1の基本構文/基本文法まとめ&Pryの使い方若手エンジニア/初心者のためのRuby 2.1入門(2)(2/7 ページ)

[著:麻田優真、監修:山根剛司,株式会社アジャイルウェア]

Rubyにおける「定数」は特殊な変数

 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の定数は「特別な種類の変数」

 また、警告は出ますが、定数は再定義できます。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のリテラル

 リテラルとは、Rubyの「プログラムに直接書ける値」のことです。ここからは、主要なリテラルについて一通り解説します。

数値リテラル

10進数で表現する整数

 素直に10進数で数値を書けば、それは10進数の整数として扱われます。

[1] pry(main)> 42
 => 42

 また、マイナス記号を付けて負の整数を表現することもできます。

[2] pry(main)> -42
 => -42

 アンダースコアで区切りを付けて、読みやすくすることもできます。

[3] pry(main)> 42_000_000
 => 42000000

n進数で表現する整数

 10進数以外にも、2進数、8進数、16進数を用いて整数を表現できます。以下は、いずれも10進数で表現した場合に「42」を表す整数の例です。

[4] pry(main)> 0b101010
 => 42
2進数
[5] pry(main)> 052
 => 42
8進数
[6] pry(main)> > 0x2A
 => 42
16進数

実数

 実数は、小数点を使って表現する方法と、指数部と仮数部を使って表現する方法とがあります。以下は、いずれも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の新機能)

 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の新機能)

 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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。