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
スポンサーリンク





ピックアップ記事

  1. awk split サンプルでわかる列の分割とセパレータ(文字・正規表現)の指定方法

    awkのsplit関数は、セパレータを指定して文字列を分割することができます。セパレータには文字や…
  2. awk for 繰り返し処理 簡単なサンプルでわかる インクリメント・デクリメント、変わった繰り返し

    awkのfor文は、カウンタを目印にして処理を繰り返したいときによく使われます。for文では、カウ…
  3. awk if サンプルでわかる条件文の書き方 一致・大小比較・正規表現を簡潔に書く方法

    awkのif条件文は、条件によって処理をわけたいときに使います。条件式では、0の判定・関係演算子・…

人気記事

  1. IGV, 解析ツール

    IGV 使い方 インストール〜便利な使い方まで | リファレンス・マッピングデータ・アノテーションを読み込んで表示しよう
    IGV(Integrative Genomics View…
  2. R データ型 - 文字列・ベクター・データフレーム・マトリックス など-, R言語, スクリプト

    R subset関数 データフレームやmatrixからの条件指定による行・列の抽出
    R の subset関数は、データフレームやマトリックスか…
  3. Excel, その他, 統計

    z-score 計算方法 エクセル(Excel) 編
    統計処理で、大きく変化しているなどの判断基準にも使われる値…

おすすめ記事

  1. R言語, グラフ

    R 使い方 軸・ラベルの調整(向き・サイズ・色など) グラフの描き方
    Rによるplot(グラフ)の描画は、手軽で大変便利です。た…
  2. awk, bash 文字列操作, シェルスクリプト

    bash 部分文字列・置換・長さ・連結・分割の文字列処理
    bashのよく使う文字列処理、部分文字列・置換・連結・長さ…
  3. bash 応用, シェルスクリプト

    シェル スクリプト ファイル存在チェック・空のファイルチェック
    bashでスクリプトを作成するときに、よく使うのがファイル…