0

有没有捷径可以做到这一点?

def value
   @val
end

def value=(value)
    @val = value
end
4

2 回答 2

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

我还没有测试过,但类似的东西应该可以。我并不是说这是一个好主意,但这就是您正在寻找的。

编辑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 
于 2012-06-29T14:46:54.423 回答
0
attr_accessor :val
alias_method :value, :val
alias_method :value=,:val=

如果要阻止原始方法的访问,可以使用

remove_method :val
remove_method :val=

我不知道你是否认为这更短。

于 2012-06-29T15:32:51.810 回答