Ruby 変数とスコープ スクリプトの書き方

バイオインフォ道場、くまぞうです。

データに名前をつけることで、変数としてプログラム中でデータを自由に扱うことができるようになります。変数には、いくつか種類があります。スコープと呼ばれる影響範囲や、クラスを用いた場合の違いがあります。

スポンサーリンク



変数とは

変数とは、プログラム中で使うデータを確保することで、一意の名前をつけることで代入や参照を可能とするものです。ラベル付けのようなものと説明されることもあります。名前をつけたデータに対して、代入や参照を行います。

var1.rb

#! /usr/bin/ruby

a = 123
b = "hello world!"

puts "a=#{a}"
puts "b=#{b}"

a = 100

puts "a=#{a}"
puts "b=#{b}"
$ ruby var1.rb
a=123          # 変数aの参照
b=hello world! # 変数bの参照
a=100          # 変数aの変更と参照
b=hello world! # 変数bの参照(変化なし)

変数とスコープ

変数にはいくつか種類があり、その参照が有効になる範囲(スコープ)も異なります。良く使うのはローカル変数ですが、グルーバル変数やクラス変数なども理解すると、効率的なプログラミングができるようになったり、オブジェクト指向に対する理解が深まったりします。

ローカル変数

ローカル変数は、使用中のブロックや関数内だけで利用できる変数です。範囲が限定されているので、内部のブロックで同じ名前の変数があっても、それらは別ものとして扱われます。

var2.rb

#! /usr/bin/ruby

puts a = 1
(10..12).each {|a| a=a+1; puts a}  #内部のブロックで「別の」aを使う
puts a
$ ruby var2.rb
1  # 外側の変数a
11 # 内側の変数a
12
13 
1  # 外側の変数a(変化なし)

グローバル変数

グローバル変数は、プログラムのどこからでも参照・代入が可能な変数です。変数名の最初の文字は「$」をつけます。便利な反面、どこで書き換えたかがわかりにくくなる弊害もありますから、どうしても必要な場合に限って使用する方が良いと思います。

var3.rb

#! /usr/bin/ruby

$a = 1
puts $a

require './val3_2.rb'  #$aを使った別のスクリプト

puts $a

val3_2.rb

$a = 2
$ ruby var3.rb
1
2  # 別のスクリプトで書き換えられた「$a」

インスタンス変数

インスタンス変数は、クラス定義を使って生成されたインスタンス毎に値を保持する変数です。先頭に@をつけます。クラス内の全メソッドで共通して使用することができます。

var4.rb

#! /usr/bin/ruby

class Animal
  attr :name, :type  # インスタンス変数用ゲッターメソッド

  def initialize(name, type)
    @name = name;  # インスタンス変数
    @type = type;  # インスタンス変数
  end
end

a = Animal.new("koro", "dog")
b = Animal.new("tama", "cat")

[a, b].each do |x|
  puts "instance -> name:#{x.name}, type:#{x.type}"
end
$ ruby var4.rb
instance -> name:koro, type:dog  # インスタンス毎の情報を保持している
instance -> name:tama, type:cat

クラス変数

クラス変数は、クラスに毎に値を保持する変数です。先頭に@@をつけます。クラスメソッド・インスタンスメソッドからアクセス・共有が可能な変数です。

var5.rb

#! /usr/bin/ruby

class Animal
  @@count = 0  # クラス変数

  attr :name, :type

  def initialize(name, type)
    @name = name;
    @type = type;
    @@count += 1
  end

  def self.count
    @@count
  end
end

a = Animal.new("koro", "dog")
b = Animal.new("tama", "cat")

[a, b].each do |x|
  puts "instance -> name:#{x.name}, type:#{x.type}"
end

puts "count = #{Animal.count}"  # クラスの情報として@@countを取得
$ ruby var5.rb
instance -> name:koro, type:dog
instance -> name:tama, type:cat
count = 2

定数について

定数とは、最初に設定したら2度と変更されないことを想定した変数です。定義された変数を変更しようとすると警告が発せられます。スコープはグローバル変数とにています。しかし、クラスやモジュールで定義された定数の参照範囲は、それらによって制限されます。

var6.rb

#! /usr/bin/ruby

puts Math::PI  # Module Mathにて定義
$ ruby var6.rb
PI = 3.141592653589793
スポンサーリンク