OOPS には、カプセル化と呼ばれる概念があります。つまり、オブジェクトの内部表現は、通常、オブジェクトの定義の外では見えません。オブジェクトの「それ自体」だけが、自身の内部状態をいじることができます。外の世界はできません。
すべてのオブジェクトは通常、その状態と動作によって定義されます。Ruby では、インスタンス変数はオブジェクトの内部状態または状態と呼ばれ、OOPS によれば、状態は他のオブジェクトからアクセスされるべきではなく、そうすることでカプセル化を順守します。
元:class Foo
def initialize(bar)
@bar = bar
end
end
上記では、クラス Foo を定義し、initialize メソッドでインスタンス変数 (属性) または (プロパティ) を初期化しました。new メソッドを使用して新しい ruby オブジェクトを作成すると、内部で initialize メソッドが呼び出され、メソッドが実行されると @bar インスタンス変数が宣言および初期化され、オブジェクトの状態として保存されます。
すべてのインスタンス変数には独自の内部状態があり、オブジェクト自体に固有です。クラスで定義するすべてのメソッドは、メソッドの定義と目的に従ってオブジェクトの内部状態を変更します。ここで、initialize メソッドは、新しいインスタンス変数の作成など、同じことを行います。
var object = Foo.new(1)
#<Foo:0x00000001910cc0 @bar=1>
バックグラウンドで、ruby はインスタンス変数 (@bar =1) を作成し、その値をオブジェクトの状態としてオブジェクト 'object' 内に格納しました。「instance_variables」メソッドで確認できます。そのメソッドは、オブジェクトの現在の状態に応じて、オブジェクトのすべてのインスタンス変数を含む配列を返します。
object.instance_variables
#[
[0]: @bar
]
上記の「@bar」インスタンス変数を見ることができます。これは、オブジェクトで initialize メソッドを呼び出したときに作成されます。この '@bar' 変数は、デフォルトでは表示 (非表示) されるべきではないため、オブジェクト以外のオブジェクトの外部から、内部から他のユーザーに表示されることはありません。ただし、オブジェクトは独自の内部状態をいじることができます。これは、値を表示または変更できることを意味します。これら 2 つは、クラスに新しいインスタンス メソッドを作成することで実行できます。
@bar 変数を呼び出して確認したい場合、デフォルトではオブジェクトの状態を確認できないため、エラーが発生します。
show = object.bar
#NoMethodError: undefined method `bar' for #<Foo:0x00000001910cc0 @bar=1>
#from (irb):24
#from /home/.rvm/rubies/ruby-2.0.0-p648/bin/irb:12:in `<main>'
しかし、変数には 2 つのメソッドでアクセスできます。これら 2 つのメソッドはセッター メソッドとゲッターメソッドと呼ばれ、オブジェクトが内部状態 (インスタンス変数/属性/プロパティ) をそれぞれ表示または変更できるようにします。
class Foo
def bar
@bar
end
def bar=(new_bar)
@bar = new_bar
end
end
getter(bar) および setter(bar=) メソッドを定義しました。任意の名前を付けることができますが、内部のインスタンス変数は、値を表示または変更するインスタンス変数と同じである必要があります。セッターとゲッターは、ある意味で OOPS の概念に違反していますが、非常に強力なメソッドでもあります。
クラスを再度開いて定義することで 2 つのメソッドを定義すると、メソッドでオブジェクトを呼び出すと、インスタンス変数 (ここでは @foo) を表示し、その値も変更できます。
object.bar
1
object.bar=2
2
object.bar
2
ここでは、@bar の値を返す bar メソッド (getter) を呼び出し、引数として new_value を指定した bar= メソッド (setter) を呼び出し、インスタンス変数 (@bar) の値を変更します。 bar メソッドを呼び出してもう一度見てください。
Ruby には、セッター メソッドとゲッター メソッドの両方を組み合わせたattr_accessorというメソッドがあり、クラス内のメソッド定義の上に定義します。attr_* メソッドは、メソッド (setter および getter) を作成するためのショートカットです。
class Foo
attr_accessor :bar
end
シンボル (:bar) を attr_accessor メソッドの引数として指定する必要があります。このメソッドは、指定されたシンボル名としてメソッド名を使用して、setter メソッドと getter メソッドの両方を内部的に作成します。
getter メソッドのみが必要な場合は、attr_reader :bar を呼び出すことができます。setter メソッドのみが必要な場合は、attr_writer :bar を呼び出すことができます。
attr_accessor は attr_writer と attr_reader メソッドの両方を作成します
コンマで区切られた attr_* メソッドに必要な数のインスタンス変数を指定できます
class Foo
attr_writer :bar
attr_reader :bar
attr_accessor :bar, :baz
end