有一个简短的方法吗?
def value
@val
end
def value=(value)
@val = value
end
答案 0 :(得分:3)
不,没有。所有attr_accessor都定义了两个方法,一个名为value(在本例中),另一个名为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 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
答案 1 :(得分:0)
attr_accessor :val
alias_method :value, :val
alias_method :value=,:val=
如果要阻止原始方法的访问,可以使用
remove_method :val
remove_method :val=
我不知道你是否认为这更短。