Top > Ruby > 変数・定数

このページの概要

  • プログラミングする上では必須になる「値のいれもの」について。
  • 動作確認環境 : Ruby 1.8.4

変数の基本

puts で画面へ文章を出す、gets でキーボードからの入力を読み取る。これを組み合わせると、下記のような「やまびこスクリプト」ができます。なにか入力して Enter キーを押すことで、入力した内容をそのまま返すというものです。

  0
  1
#!/usr/bin/env ruby
puts gets

このプログラムを応用して、足し算するスクリプトを作ろうと思います。 2行数字を入力したら、合計を表示するスクリプトです。 数字の入力は gets.to_i で行えます。gets はキー入力、.to_i は入力内容を数字と見なす飾り、くらいに今は考えてください。変数を使わないものと使うもの、どちらがわかりやすいですか?

  1. 変数を使わないもの
      0
      1
    
    #!/usr/bin/env ruby
    puts gets.to_i + gets.to_i
  2. 変数を使うもの
      0
      1
      2
      3
      4
    
    #!/usr/bin/env ruby
    x = gets.to_i   #=>1行目の入力
    y = gets.to_i   #=>2行目の入力
    answer = x + y  #=>x+yを足した答え(answer)
    puts answer     #=>answer を表示
    

前者はgets.to_iが何を意味するのか、ぱっと見で理解できません。今はサンプルだから理解できるかもしれませんが、このようなコーディングを実用的なスクリプト作りで使おうとしたら、規模が大きくなるにつれて苦労も雪だるま式に増えていくことでしょう。

後者は gets.to_i が x と y という「値のいれもの」に格納されることがわかります。#=> というコメントが理解を助けます。x + y はふつうの足し算ですね、x に 1、y に 2 が入っていたら 1 + 2、つまり 3 になります。answer = x + y は answer = 3 となり、answer に 3 が入ります。そして、puts answer は answer に 3 が入っているので、puts 3 と同じになります。画面には 3 が表示されているはずです。

answer = x + y の部分については、+ を - * / といった四則演算の記号に変えることも可能ですし、 x = x + y という「yはゼロになるの?」と間違えてしまいそうな数式もできます(Ruby では x に x+y の和をいれなさいよ、という解釈になります。これは C言語などの他のプログラミング言語でも同じはずです)

変数には「型」はあるけど明記不要

ほかのスクリプトやプログラミング言語を学んでいると、「型はないのか」と疑問に思うかもしれません。C言語なら int x と定義しなければ文法エラー (x は数字なのか文字なのかわからないよ) となってしまいますが、Ruby の場合は = の右側を見て自動的に「値のいれもの」の型を判断してくれますので、明記する必要がないのです。先ほどのスクリプトでは、.to_i があることで、入力内容は数値であると明示したようなかたちになっていました。試しに、足し算スクリプトで .to_i を無くして、1行目に1、2行目に2を入れて計算させてみましょう。

  0
  1
  2
  3
  4
#!/usr/bin/env ruby
x = gets        #=>1行目の入力
y = gets        #=>2行目の入力
answer = x + y  #=>x+yを足した答え(answer)
puts answer     #=>answer を表示

3 ではなく 1[改行]2 と表示されたかと思います。これは、gets だけだと「入力されたものは文字列である」と判断されてしまうからです。answer = x + y は answer = "1\n" + "2\n" (\n は改行を意味していますね) と解釈され、puts answer は puts "1\n2\n" となってしまった、というわけです。

「値のいれもの」が数字なのか文字列なのかを調べるには、変数の後ろに .class を付けます。

  0
  1
  2
  3
  4
#!/usr/bin/env ruby
x = gets        #=>1行目の入力 (文字列型)
y = gets.to_i   #=>2行目の入力 (数値型)
puts x.class    #=>「String」と表示される
puts y.class    #=>「Fixnum」または「Bignum」と表示される

もっとも、.class でわかるのは「今の型」であり、違う型を入れることも可能です。

  0
  1
  2
  3
  4
#!/usr/bin/env ruby
x = 1
puts x.class #=>「Fixnum」
x = "1"
puts x.class #=>「String」

「値のいれもの」の型は .to_i (数値へ変換) や .to_s (文字列へ変換) や .to_f (小数点つき数値へ変換) を行うこともできます。.to_なんとか は変換担当、と覚えておくとよさそうです。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
#!/usr/bin/env ruby
x = 1
puts x.class #=>「Fixnum」
p x          #=> 「1」 (puts だと見分けがつかないので、あえて p を使っています)
x = x.to_s
puts x.class #=>「String」
p x          #=> 「"1"」 (puts だと見分けがつかないので、あえて p を使っています)
x = x.to_f
puts x.class #=>「Float」
p x          #=> 「1.0」

定数

すべて大文字の変数(?)は、定数となります。 定数は「最初に値をセットしたら、最初の値のまま変わらない」特性をもっています。 よって、定数に「2度目以降の値セット」をしようとすると警告が出ます。

  0
  1
  2
  3
  4
#!/usr/bin/env ruby
MY_NUMBER = 1
puts MY_NUMBER  #=> 1
MY_NUMBER = 100 #=> -:4: warning: already initialized constant MY_NUMBER
puts MY_NUMBER  #=> 100 (警告されるが、いちおう代入はされる)

擬似変数

擬似変数というものが定義されています。

  • 今自分のいるクラス(実行主体) を示す self
  • 「空(null)」を意味する nil
  • 「真」を意味する true
  • 「偽」を意味する false
  • スクリプトのファイル名を返す __FILE__
  • スクリプトの行数を返す __LINE__

検証コード (puts ほげほげ で文字列の表示、puts ほげほげ.class で型の表示) を書いてみました。 puts ではなく p を呼んでいるのは、文字列型は " " でくくってくれてわかりやすいからです。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
#!/usr/bin/env ruby
p self           #=>現在の実行主体。「main」
p self.class     #=>「object」
p nil            #=>空っぽ。「nil」
p nil.class      #=>「NilClass」
p true           #=>真。「true」
p true.class     #=>「TrueClass」
p false          #=>偽。「false」
p false.class    #=>「FalseClass」
p __FILE__       #=>ファイル名。「"ファイル名"」
p __FILE__.class #=>「String」
p __LINE__       #=>行数。「12」
p __LINE__.class #=>「Fixnum」

言語に組み込まれた変数・定数

その他

  • 小文字で始まる変数(ローカル変数)にはスコープ(有効範囲)があります。スコープは、以下のとおりです。
    • class ... endの間
    • module ... endの間
    • def ... endの間
    • イテレータブロックの中 ({ ... } の間)
    • プログラムのはじめから終りまで(上記以外)
  • $ ではじまる変数はグローバル変数と解釈されます。自分でグローバル変数を新規定義して使うのはできる限り避けた方がいいでしょう。
  • @ や @@ ではじまる変数は class を定義するとき専用に使うクラス用変数(インスタンス変数)と解釈されますが、最初のうちは使う機会がないものと思われます。

リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Fri, 22 Jul 2011 21:57:59 JST (1525d)