これを行う短い方法はありますか?
def value
@val
end
def value=(value)
@val = value
end
これを行う短い方法はありますか?
def value
@val
end
def value=(value)
@val = value
end
いいえ、ありません。attr_accessorが行うのは、2つのメソッドを定義することだけです。1つはvalue(この場合)と呼ばれ、もう1つは同じ名前のインスタンス変数を設定するvalue=と呼ばれます。getter / setterメソッドを介してのみインスタンス変数にアクセスする必要があるため、内部で何と呼ばれるかは問題ではありません。
継承している場合は、superの呼び出しを使用して、不変性を確保できます。
class Walrus
attr_accessor :bubbles
end
class Harold < Walrus
def bubbles
# do Harold related things here
super
end
def bubbles=(value)
# do Harold related things here
super(value)
end
end
編集
本当にやりたい場合は、クラスで独自のメソッドを定義できます。
class Class
def attr_accessor2(method_name, attribute_name)
define_method(method_name) do
instance_variable_get("@#{attribute_name}")
end
define_method("#{method_name}=") do |value|
instance_variable_set("@#{attribute_name}", value)
end
end
end
私はそれをテストしていませんが、そのようなものはうまくいくはずです。それが良い考えだと言っているわけではありませんが、それがあなたが探しているものです。
EDIT2
実際の動作は次のとおりです。
1.9.3p0 :012 > class Derp
1.9.3p0 :013?> attr_accessor2 :herp, :meep
1.9.3p0 :014?> end
=> #<Proc:0x007fc75b02e958@(irb):7 (lambda)>
1.9.3p0 :015 > d = Derp.new
=> #<Derp:0x007fc75b027e00>
1.9.3p0 :016 > d.herp
=> nil
1.9.3p0 :017 > d.herp = 10
=> 10
1.9.3p0 :018 > d.herp
=> 10
1.9.3p0 :019 > d.instance_variable_get("@meep")
=> 10
attr_accessor :val
alias_method :value, :val
alias_method :value=,:val=
元のメソッドのアクセスをブロックしたい場合は、使用できます
remove_method :val
remove_method :val=
あなたがこれをもっと短く考えるかどうかはわかりません。