Rubyのクラスとインスタンス変数の基本
Rubyはオブジェクト指向プログラミング言語であり、その中心的な概念の一つが「クラス」です。クラスはオブジェクトの設計図のようなもので、オブジェクトの振る舞い(メソッド)と状態(インスタンス変数)を定義します。
class MyClass
def initialize
@my_instance_variable = "Hello, world!"
end
def greet
puts @my_instance_variable
end
end
my_object = MyClass.new
my_object.greet # => "Hello, world!"
上記の例では、MyClass
というクラスを定義しています。このクラスにはinitialize
とgreet
という2つのメソッドがあります。initialize
メソッドは特殊なメソッドで、新しいオブジェクトが作成されるとき(MyClass.new
)に自動的に呼び出されます。このメソッド内で@my_instance_variable
というインスタンス変数を定義し、初期値として文字列"Hello, world!"
を設定しています。
インスタンス変数は、その名前が@
記号で始まる変数です。インスタンス変数はクラスの中で共有され、クラスのすべてのメソッドからアクセスできます。このため、greet
メソッド内で@my_instance_variable
を参照すると、initialize
メソッドで設定した値"Hello, world!"
が出力されます。
以上が、Rubyのクラスとインスタンス変数の基本的な使い方です。次のセクションでは、インスタンス変数へのアクセス方法について詳しく説明します。
インスタンス変数へのアクセス方法
Rubyでは、インスタンス変数へのアクセスは非常に簡単です。インスタンス変数は、その名前が@
記号で始まる変数で、クラスのすべてのメソッドからアクセスできます。
class MyClass
def initialize
@my_instance_variable = "Hello, world!"
end
def greet
puts @my_instance_variable
end
end
my_object = MyClass.new
my_object.greet # => "Hello, world!"
上記の例では、greet
メソッド内で@my_instance_variable
を参照すると、initialize
メソッドで設定した値"Hello, world!"
が出力されます。
ただし、Rubyのクラス外部からインスタンス変数に直接アクセスすることはできません。これは、オブジェクト指向プログラミングの原則である「カプセル化」を守るためです。カプセル化は、オブジェクトの内部状態を直接操作することを防ぎ、オブジェクトの振る舞い(メソッド)を通じてのみ状態を変更することを推奨します。
したがって、クラス外部からインスタンス変数にアクセスするには、「アクセサメソッド」を定義する必要があります。Rubyでは、attr_accessor
、attr_reader
、attr_writer
といった特殊なメソッドを使用して、これらのアクセサメソッドを簡単に定義できます。
class MyClass
attr_accessor :my_instance_variable
def initialize
@my_instance_variable = "Hello, world!"
end
end
my_object = MyClass.new
puts my_object.my_instance_variable # => "Hello, world!"
my_object.my_instance_variable = "Hello, Ruby!"
puts my_object.my_instance_variable # => "Hello, Ruby!"
上記の例では、attr_accessor :my_instance_variable
という行が追加されています。これにより、my_instance_variable
という名前のアクセサメソッドが自動的に定義され、クラス外部から@my_instance_variable
にアクセスできるようになります。
以上が、Rubyのインスタンス変数へのアクセス方法の基本です。次のセクションでは、クラスインスタンス変数について詳しく説明します。
クラスインスタンス変数とは何か
Rubyのクラスインスタンス変数は、特定のクラスのインスタンス(オブジェクト)間で共有される変数です。クラスインスタンス変数の名前は@@
記号で始まります。
クラスインスタンス変数は、そのクラスのすべてのインスタンスで共有されます。つまり、あるインスタンスがクラスインスタンス変数の値を変更すると、その変更はそのクラスのすべての他のインスタンスに影響します。
class MyClass
@@my_class_instance_variable = "Hello, world!"
def self.read_variable
@@my_class_instance_variable
end
def self.write_variable(value)
@@my_class_instance_variable = value
end
end
puts MyClass.read_variable # => "Hello, world!"
MyClass.write_variable("Hello, Ruby!")
puts MyClass.read_variable # => "Hello, Ruby!"
上記の例では、MyClass
というクラスを定義し、その中で@@my_class_instance_variable
というクラスインスタンス変数を定義しています。このクラスインスタンス変数は、MyClass
のすべてのインスタンスで共有されます。
また、read_variable
とwrite_variable
というクラスメソッドを定義しています。これらのメソッドは、クラスインスタンス変数@@my_class_instance_variable
の値を読み書きするためのものです。
以上が、Rubyのクラスインスタンス変数の基本的な使い方です。次のセクションでは、クラス変数とクラスインスタンス変数の違いについて詳しく説明します。
クラス変数とクラスインスタンス変数の違い
Rubyには、クラス変数とクラスインスタンス変数という2つの種類の変数があります。これらは名前が似ているため混同されやすいですが、振る舞いは大きく異なります。
クラス変数
クラス変数は、その名前が@@
記号で始まる変数です。クラス変数は、そのクラスとそのすべてのサブクラスで共有されます。
class Parent
@@my_class_variable = "Hello, world!"
def self.read_variable
@@my_class_variable
end
def self.write_variable(value)
@@my_class_variable = value
end
end
class Child < Parent
end
puts Parent.read_variable # => "Hello, world!"
Parent.write_variable("Hello, Ruby!")
puts Parent.read_variable # => "Hello, Ruby!"
puts Child.read_variable # => "Hello, Ruby!"
上記の例では、Parent
クラスとそのサブクラスChild
が@@my_class_variable
というクラス変数を共有しています。
クラスインスタンス変数
一方、クラスインスタンス変数は、その名前が@
記号で始まる変数です。クラスインスタンス変数は、そのクラスのインスタンス(オブジェクト)間で共有されます。
class MyClass
@my_class_instance_variable = "Hello, world!"
def self.read_variable
@my_class_instance_variable
end
def self.write_variable(value)
@my_class_instance_variable = value
end
end
puts MyClass.read_variable # => "Hello, world!"
MyClass.write_variable("Hello, Ruby!")
puts MyClass.read_variable # => "Hello, Ruby!"
上記の例では、MyClass
のすべてのインスタンスが@my_class_instance_variable
というクラスインスタンス変数を共有しています。
以上が、Rubyのクラス変数とクラスインスタンス変数の違いです。これらの違いを理解することで、Rubyのクラスとオブジェクトの振る舞いをより深く理解することができます。次のセクションでは、これらの変数をどのように使用するか、またそれぞれの変数が適している状況について詳しく説明します。