静岡理工科大学 菅沼ホーム Ruby 目次 索引

リテラル

  1. 数値
  2. 文字列
  3. ヒアドキュメント
  4. シンボル
  5. %記法
  数字の 1 や文字列 "hello world" のように Ruby のプログラムの中に直接記述できる値の事をリテラルといいます.Ruby においては,リテラルもオブジェクトです.

  1. 数値

      文字コード以外の数値リテラルには,

    x = 123_456_789
    printf "%d\n", x

    のように,_ を含めることができます.Ruby インタプリタは,_ を無視し,特別な解釈は何もしません.これは,大きな数値の桁数がひと目でわかるように記述するのに便利です.上の例の場合,その出力は,123456789 になります.

      数値において,整数や ?a などは,Integer クラス のサブクラスである Fixnum クラスのインスタンスです.ただし,整数の大きさが Fixnum によって表現できる範囲を超えると Bignum クラスのインスタンスとして扱われます.また,浮動小数点数は,Float クラスのインスタンスです.

  2. 文字列

      文字列リテラルは,ダブルクォート( " ),または,シングルクォート( ' )で囲んで表現し,String クラスのインスタンスです.ダブルクォートで囲まれた文字列では,後に述べる,バックスラッシュ記法式展開が有効になります.シングルクォートで囲まれた文字列では,\\ (バックスラッシュそのもの)と \' (シングルクォート),行末の \ (改行を無視)を除いて文字列の中身の解釈は行われません.

      複数行にわたって書くこともできます.この場合,含まれる改行文字は常に \n になります.また,空白を間に挟んだ文字列リテラルは,1 つの文字列リテラルと見倣されます.文字列の結合は,+ 演算子によって可能ですので,以下の 2 つの式は,同じ結果 abcefg を出力します.

    printf "abc" + "efg\n"
    printf "abc" "efg\n"

      以下に示すように,バックスラッシュ( \ )を使用して,特別な文字(制御文字など)を表現することが可能です.これを,バックスラッシュ記法と呼びます.C/C++ などにおけるエスケープシーケンスに相当します.

    • \t  タブ( 0x09 )
    • \n  改行( 0x0a )
    • \r  キャリッジリターン( 0x0d )
    • \f  改ページ( 0x0c )
    • \b  バックスペース( 0x08 )
    • \a  ベル( 0x07 )
    • \e  エスケープ( 0x1b )
    • \s  空白( 0x20 )
    • \nnn  8 進数表記( n は 0-7 )
    • \xnn  16 進数表記( n は 0-9,a-f )
    • \cx,\C-x  コントロール文字( x は ASCII 文字)
    • \M-x  メタ x ( c | 0x80 )
    • \M-\C-x  メタコントロール x
    • \x  文字 x そのもの

      ダブルクォート( " ),または,バッククォート( ` )で囲まれた文字列,及び,正規表現の中では,#{ 式 } という形式で式の内容(式を評価した結果)を埋め込むことができます.この機能を式展開と呼びます.式が変数記号 $,または,@ で始まる変数の場合には { } を省略して,「#変数名」という形式でも展開できます.文字 # に続く文字が {,$,@ でなければ,そのまま文字 # として解釈されます.明示的に式展開を止めるには # の前にバックスラッシュを置きます.式展開の中には,ダブルクォートなども含めて Ruby の式をそのまま書くことができます.コメントも許されます.次の枠内に示すプログラムを実行すると,次のような結果が得られます.
    私は,山田太郎 です
    私は,山田 です
    私は,山田 です
    私は,#{ $sei } です
    			
    $sei = "山田"
    $nam = "太郎"
    print "私は,#{ $sei + $nam } です\n"
    print "私は,#{ $sei } です\n"
    print "私は,#$sei です\n"
    print "私は,\#{ $sei } です\n"  # 式展開が行われない
    			
      バッククォート( ` )で囲まれた文字列は,ダブルクォートで囲まれた文字列と同様に,バックスラッシュ記法の解釈と式展開が行なわれた後,コマンドとして実行され,その標準出力が文字列として与えられます.コマンドの終了ステータスを得るには,組み込み変数 $? を参照します.次に示すプログラムは,「 ls -l 」コマンドを実行し,その結果を変数 y に代入しています.このプログラムを実行すると,次のような結果が得られます.
    total 1
    -rwxr-xr-x   1 1005     everyone       44 Jun  8 13:45 test.rb
    
    終了ステータス 0
    			
    #! ruby -Ks
    y = ` ls -l `
    printf "%s\n", y
    printf "終了ステータス %d\n", $?
    			

  3. ヒアドキュメント

      普通の文字列リテラルは,デリミタ( ",',` など)で囲まれた文字列ですが,ヒアドキュメントは,

    <<識別子
      文字列
      ・・・
    識別子

    のように,「 <<識別子」を含む行の次の行から,「識別子」だけの行の直前までを文字列とする行指向のリテラルです.ヒアドキュメントも,通常の文字列と同様,String クラスのインスタンスです.例えば,
    <<EXAMPLE
      Test String 1
      Test String 2
    EXAMPLE
    			
    は," Test String 1\n Test String 2\n" と同じになります.また,「<<EXAMPLE」が,文字列全体に対応する識別子(文法要素としての式)となりますので,例えば,String クラスのメソッド upcase (すべての文字を大文字に変換するメソッド)を使用するには,枠内に示すプログラムのように記述します.このプログラムを実行すると下に示すような出力結果が得られます.
      TEST STRING 1
      TEST STRING 2
    			
    printf "%s", <<EXAMPLE.upcase
      Test String 1
      Test String 2
    EXAMPLE
    #printf "%s", "  Test String 1\n  Test String 2\n".upcase と同じ
    			
      また,ヒアドキュメントをメソッドの引数とするには,枠内に示すプログラムのようにして行います.なお,このプログラムは,2 つのヒアドキュメントを引数にした例です.このプログラムを実行すると下に示すような出力結果が得られます.
      Test String 1
      Test String 2
      Test String 3
    Number of Line 3
    			
    def func (par1, par2, par3)
    	printf "%s", par1
    	printf "%s", par2
    	printf "Number of Line %d\n", par3
    end
    
    func (<<EXAMPLE1, <<EXAMPLE2, 3)
      Test String 1
      Test String 2
    EXAMPLE1
      Test String 3
    EXAMPLE2
    			
      開始ラベル「<<識別子」の識別子を ダブルクォート( " ),シングルクォート( ' ),または,バッククォート( ` )によって囲むことによって,ヒアドキュメントとなる文字列リテラルの性質は,対応する文字列リテラルと同じ扱いになります.なお,識別子がクォートで囲まれていないときは,ダブルクォートで囲まれている場合と同じです.詳細については,以下に示すプログラム例と出力結果を見て下さい.
    $name = "太郎"
    
    # 式展開を行う
    printf "%s", <<"EXAMPLE"
    My name is #{$name}.
    EXAMPLE
    
    # 式展開を行わない
    printf "%s", <<'EXAMPLE'
    My name is #{$name}.
    EXAMPLE
    
    # コマンドを実行
    x =  <<`EXAMPLE`
    ls -l
    EXAMPLE
    printf "%s\n", x
    			
    (出力)
    My name is 太郎.
    My name is #{$name}.
    total 1
    -rw-r--r--   1 1005     everyone      242 Jun  9 11:40 test.rb
    			

  4. シンボル

      シンボルは,Symbol クラスのインスタンスであり,Symbol オブジェクトは,特定の文字列と一対一に対応します.シンボルはプログラム内で一意の整数値であり,
    :abc
    			
    と記述することによって,文字列 "abc" をシンボル :abc (整数値)に一対一で対応させます.Ruby においては,予約後,変数名,リテラルなどはシンボルを使用して管理しています.例えば,文字列リテラルは,出現するたびに新しい String クラスのインスタンスを生成し,それらに異なるシンボルを対応させます.枠内に示すプログラムにおいて,ダブルクォートで囲まれた文字列は,すべて異なるシンボルに対応しています.従って,その内容が同じであっても,引数が self 自身であるとき真を返す Object クラスのメソッド equal? を使用して比較すると false を返します.なお,このプログラムにおいて,to_s は,シンボルに対応する文字列を返す Symbol クラスのメソッドです.
    p ("abc" == "abc") ? true : false
    p ("abc".equal?("abc")) ? true : false
    p ("abc" == :abc) ? true : false
    p ("abc" == :abc.to_s) ? true : false
    p ("abc".equal?(:abc.to_s)) ? true : false
    p (:abc == :abc) ? true : false
    p (:abc.equal?(:abc)) ? true : false
    p (:abc == :"abc") ? true : false
    p (:abc.equal?(:"abc")) ? true : false
    			
    (出力)
    true
    false
    false
    true
    false
    true
    true
    true
    true
    			
      シンボルは,ハッシュテーブルにおいて良く使用されます.ハッシュとは,任意のオブジェクトをキー(添字)として持つ配列であり,Hash クラスのインスタンスです.枠内のプログラムでは,:name,及び,:address をキーとする 2 つのデータからなるハッシュテーブルを作成しています.このプログラムを実行すると,以下に示すような結果が得られます.なお,puts は,オブジェクトを出力する組み込み関数です.
    山田太郎
    静岡県
    			
    #! ruby -Ks
    
    def func(x)
      puts x[:name]
      puts x[:address]
    end
    
    func ({:name => "山田太郎", :address => "静岡県"})
    			

  5. %記法

      文字列リテラル,コマンド出力,正規表現リテラル,配列式,シンボルでは,% で始まる形式の記法(% 記法)を用いることによって,通常の区切り文字を他の文字に変更することができます.例えば,次のプログラム例(先に示した例と同じ)では,コマンドの実行の際に使われる区切り文字 ` ` を,{ } に変更しています.
    #! ruby -Ks
    y = %x{ ls -l }
    printf "%s\n", y
    			
      %記法には,以下のようなものがあります.! の部分には,改行を含めた任意の非英数字を使うことができます.始まりの区切り文字が括弧( (,[,{,< )である時には,終りの区切り文字は対応する括弧になります.括弧を区切り文字にした場合,対応が取れていれば区切り文字と同じ括弧を要素に含めることができます.

    • %!STRING!  ダブルクォート文字列
    • %Q!STRING!  同上
    • %q!STRING!  シングルクォート文字列
    • %x!STRING!  コマンド出力
    • %r!STRING!  正規表現
    • %w!STRING!  要素が文字列の配列(空白区切り)
    • %W!STRING!  要素が文字列の配列(空白区切り).式展開,バックスラッシュ記法が有効
    • %s!STRING!  シンボル.式展開,バックスラッシュ記法は無効

静岡理工科大学 菅沼ホーム Ruby 目次 索引