0

これを行う短い方法はありますか?

def value
   @val
end

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

2 に答える 2

3

いいえ、ありません。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 
于 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 に答える