Blog Article
Ruby 基礎 ~ 変数の宣言や代入について ~

はじめに
Ruby のプログラムでは、データを名前で扱うために変数を使用します。変数への代入や再代入、多重代入、変数の種類とスコープを理解すると、Ruby のコードをより読みやすく書けるようになります。今回は、変数の基本的な使い方を整理します。
参考リンク
変数とは?
変数とは、値を名前で扱うための仕組みです。例えば、ユーザーの名前や年齢などの値に name や age という名前を付けておくことで、その後の処理で同じ値を利用できます。また、変数には別の値を再び代入することもできます。
「値を保存しておく箱」と考えると理解しやすいですが、Ruby では変数そのものがオブジェクトを格納しているというより、変数名を使ってオブジェクトを参照すると考えるとより正確です。まずは、値に名前を付けて扱うための仕組みと理解しておけば問題ありません。
変数を使う理由
変数を使うことで、同じ値を何度も直接書かずに済むようになります。また、変数名に意味を持たせることで、コードを読んだときに、その値が何を表しているのか理解しやすくなります。
例えば、次のコードでは user_name という名前から、ユーザーの名前を表していることが分かります。
user_name = "John"
puts user_nameこのように、変数は値の再利用だけでなく、コードの可読性を高める役割も持っています。
変数の宣言と代入
Ruby では、他のプログラミング言語にあるような変数の宣言専用の構文は基本的にありません。ローカル変数の場合、小文字または _ で始まる名前に対して最初の代入を行うことで、そのスコープにローカル変数が定義されます。そのため、変数を使う前に int や String のような型を指定して宣言する必要もありません。
変数への代入
Ruby では、= を使って変数に値を代入します。
name = "Ruby"
age = 25この例では、name に "Ruby"、age に 25 を代入しています。その後、変数名を使うことで、それぞれの値を利用できます。
puts name
#=> Ruby
puts age
#=> 25Ruby は動的型付け言語なので、変数を作る際にデータ型を指定する必要はありません。
変数の命名規則
Ruby のローカル変数は、小文字またはアンダースコア _ から始まる名前を使用します。数字から始めることはできません。
複数の単語を組み合わせる場合は、snake_case と呼ばれる書き方が一般的です。
first_name = "John"
user_age = 30first_name や user_age のように、単語を _ でつなぐことで、それぞれが何を表す変数なのか分かりやすくなります。
一方、次のように数字から始める名前は変数名として使用できません。
1name = "Ruby"このような名前は Ruby の構文として正しくないため、エラーになります。
変数の種類
Ruby には、名前の先頭に付く記号などによって区別される複数の変数があります。代表的なものが、ローカル変数、グローバル変数、インスタンス変数、クラス変数です。
それぞれで有効になる範囲や、どのオブジェクトに関連付けられるかが異なります。そのため、変数を扱う際には「どこからでも使えるのか」「特定のオブジェクトに属するのか」といった違いを理解することが重要です。
ローカル変数
ローカル変数は、その処理の中で一時的に使う変数です。Ruby では、最も頻繁に使用する変数の種類です。変数名は小文字または _ から始まり、基本的には、その変数が定義された範囲の中で利用できます。
例えば、次の greeting は greet メソッドの中で使うローカル変数です。
def greet
greeting = "Hello!"
puts greeting
end
greet
#=> Hello!greeting は greet メソッドの中で定義されているため、メソッドの外側からそのまま利用することはできません。
def greet
greeting = "Hello!"
end
greet
puts greetingこの場合、greeting はメソッドの外側では利用できないため、NameError が発生します。
このように、ローカル変数は「今の処理の中だけで使う値」と考えると分かりやすいです。
グローバル変数
グローバル変数は、プログラムのさまざまな場所から利用できる変数です。変数名の先頭に $ を付けて定義します。
$global_var = "Hello!"
def greet
puts $global_var
end
greet
#=> Hello!この例では、$global_var をメソッドの外側で定義していますが、greet メソッドの中からも参照できます。
このように、グローバル変数は広い範囲から同じ値を参照できることが特徴です。
ただし、さまざまな場所から値を変更できるため、「どこで値が変更されたのか分かりにくくなる」という問題が起こりやすくなります。そのため、グローバル変数は必要な場合を除いて多用せず、できるだけ影響範囲の狭い変数を使うほうが、コードを管理しやすくなります。
インスタンス変数
インスタンス変数は、変数名の先頭に @ を付けて表します。特定のオブジェクトが持っているデータを保存するための変数です。
例えば、名前を持つ Person オブジェクトを作る場合を考えてみます。
class Person
def initialize(name)
@name = name
end
def greet
puts "Hello, my name is #{@name}."
end
end
person = Person.new("John")
person.greet
#=> Hello, my name is John.ここでは、Person.new("John") によって Person オブジェクトが作られ、そのオブジェクトの @name に "John" が保存されます。
greet メソッドでは、そのオブジェクトが持っている @name を利用して名前を表示しています。
つまり、インスタンス変数は「そのオブジェクトが持っている情報」と考えると分かりやすいです。
例えば、Person オブジェクトを複数作ると、それぞれが異なる @name を持つことができます。
person1 = Person.new("John")
person2 = Person.new("Mike")この場合、person1 は "John"、person2 は "Mike" という、それぞれ異なる @name を持ちます。
クラス変数
クラス変数は、変数名の先頭に @@ を付けて表します。クラスと、そのクラスに関係するオブジェクトの間で共有される変数です。
例えば、クラス変数を使って、Person に関する共有の値を持たせることができます。
class Person
@@species = "Homo sapiens"
def species
puts @@species
end
end
person1 = Person.new
person2 = Person.new
person1.species
#=> Homo sapiens
person2.species
#=> Homo sapiensこの例では、person1 と person2 は別々の Person オブジェクトですが、どちらからも同じ @@species を参照できます。
インスタンス変数の @name が「それぞれのオブジェクトが個別に持つ値」なのに対して、クラス変数の @@species は「複数のオブジェクトから共有される値」という違いがあります。
ただし、クラス変数は継承関係にあるクラスとも共有されるため、意図しない変更が別のクラスに影響することがあります。そのため、単純に「クラスに関連する値を保存したい」という理由だけでクラス変数を使うのではなく、目的に応じてクラスのインスタンス変数など別の方法を検討することも重要です。
変数の再代入
Ruby では、すでに値が代入されている変数に対して、別の値を再び代入できます。これを再代入と呼びます。
age = 25
age = 30
puts age
#=> 30最初に age へ 25 を代入した後、30 を再代入しています。そのため、最後に age を参照すると 30 になります。
このように、変数はプログラムの途中で値を更新できます。例えば、カウンターの値を増やしたり、ユーザーの入力結果を別の値に置き換えたりするときなどに利用します。
多重代入
Ruby では、複数の変数に対して一度に値を代入できます。これを多重代入と呼びます。
a, b, c = 1, 2, 3
puts a
#=> 1
puts b
#=> 2
puts c
#=> 3この例では、右側にある 1、2、3 がそれぞれ左側の a、b、c に代入されます。
多重代入を利用すると、複数の値を個別に代入するよりも簡潔に記述できます。
配列を使った多重代入
多重代入は、配列の要素を複数の変数に分けて代入するときにも利用できます。
array = [4, 5, 6]
x, y, z = array
puts x
#=> 4
puts y
#=> 5
puts z
#=> 6この場合、配列の各要素が順番に x、y、z に代入されます。
Ruby の多重代入は、複数の値をまとめて扱いたい場合や、配列の要素を複数の変数へ展開したい場合に便利な機能です。
まとめ
Ruby の変数は、値を名前で扱うための基本的な仕組みです。= を使って値を代入し、変数名を指定することで、その値を後から利用できます。また、同じ変数へ別の値を代入する再代入や、複数の値を一度に代入する多重代入も利用できます。
さらに、Ruby にはローカル変数、グローバル変数、インスタンス変数、クラス変数などがあり、それぞれスコープや値の共有範囲が異なります。特にローカル変数とインスタンス変数は、Ruby のコードを書くうえで頻繁に登場するため、それぞれの違いを理解しておくことが重要です。