有没有捷径可以做到这一点?
def value
@val
end
def value=(value)
@val = value
end
有没有捷径可以做到这一点?
def value
@val
end
def value=(value)
@val = value
end
不,那里没有。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
我还没有测试过,但类似的东西应该可以。我并不是说这是一个好主意,但这就是您正在寻找的。
编辑2
以下是它在实践中的工作方式:
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=
我不知道你是否认为这更短。