Rubyのattr_reader、attr_writterについて
使用目的
インスタンス変数をクラス外部で参照、書き換えるため
参照: ゲッターメソッド(attr_reader)
書き換え: セッターメソッド(attr_writter)
ゲッター、セッターメソッドの記述の省略
クラス内のプロパティ(属性)へのアクセスを制限する
補足
参照するインスタンス変数は必ずしもinitialize メソッド内で定義したインスタンス変数だけに限定されるわけではない
attrの語源: 「attribute(属性)」の略
accessorの語源: 「access(アクセス)」
アクセサメソッドとは
attr_reader、attr_writter の総称
attr_reader、attr_writter を同時定義するattr_accessor も含まれるっぽい
attr_reader、attr_writterの有り/無しの比較
attr_reader(ゲッターメソッド)
インスタンス変数の参照のみ(書き換え不可)
code: (ruby)
# ゲッターメソッド
class User
def initialize(name)
@name = name
end
def name # @nameを参照する
@name
end
end
user = User.new('Alice')
code: (ruby)
# attr_reader
class User
attr_reader :name # @nameを参照するnameメソッドを定義
def initialize(name)
@name = name
end
end
user = User.new('Alice')
user.name #=> Alice # attr_readerのnameメソッドの呼び出し attr_writter
インスタンス変数の書き換えのみ(参照不可)
code: (ruby)
# セッターメソッド
class User
def initialize(name)
@name = name
end
def name=(value) # @nameを書き換え
@name = value
end
end
user = User.new('Alice')
user.name = 'Bob'
user.name #=> Bob # 値が書き換わっている code: (ruby)
# attr_writter
class User
def initialize(name)
@name = name
end
end
user = User.new('Alice')
user.name = 'Bob'
user.name #=> Bob # attr_writterのnameメソッド attr_accesorの使い方
クラス外からインスタンス変数の参照、書き換えどちらも行いたい場合に使用する
ゲッター、セッターどちらのアクセサメソッドも定義する
code: (ruby)
class User
def initialize(name)
@name = name
end
end
user = User.new('Alice')
user.name #=> Alice # attr_accessorのnameゲッターメソッド user.name = 'Bob' # attr_accessorのnameセッターーメソッド
条件によるアクセス制限のサンプル
code: (ruby)
class Example
def initialize(value)
@value = value
end
# ゲッターメソッド
def value
# 読み取りの制御ロジック
@value if authorized?
end
# セッターメソッド
def value=(new_value)
# 書き込みの制御ロジック
@value = new_value if authorized?
end
private
def authorized?
# ここでアクセスの制御ロジックを定義
true # この例では常にtrue
end
end
example = Example.new(10)
puts example.value # => 10 # ゲッターメソッド
example.value = 20 # セッターメソッド
puts example.value # => 20