Ruby attr_accessor,方法名称!=实例变量名称

时间:2012-06-29 14:40:28

标签: ruby instance-variables attr-accessor

有一个简短的方法吗?

def value
   @val
end

def value=(value)
    @val = value
end

2 个答案:

答案 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=

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