Ruby范围变量

时间:2011-05-04 22:58:47

标签: ruby

以下是代码:

class Something
   attr_accessor :x
   def initialize(x)
      @x = x
   end
   def get_x
      x
   end
end

something = Something.new(5)
something.get_x # => 5

如果x只是get_x方法中的局部变量,为什么解释器返回5?感谢

3 个答案:

答案 0 :(得分:5)

x也是一种方法。 attr_accessor :x为您的班级添加了x=x。因此,get_x调用x方法,并返回@x的值。有关详细信息,请参阅http://www.rubyist.net/~slagell/ruby/accessors.html

答案 1 :(得分:4)

attr_accessor :x为您添加了两种方法:

def x=(val)
  @x = val
end

def x
  @x
end

如果你添加了get_x方法,那么你实际上并不需要attr_accessor getter。

<强> UPD

所以问题是

class Something
  attr_accessor :x
  def initialize(x)
    @x = x
  end
  def set_x=(new)
    x = new
  end
end

为什么x = new不会调用默认的x setter:因为默认的x setter是一个实例方法,所以你可以为一个对象(Something实例)调用它,但不能在你的类中调用它就像你尝试一样。

答案 2 :(得分:2)

attr_accessor定义了在x中调用的方法x=(和setter get_x)。

>> something.methods.grep /^x/
=> [:x, :x=]
相关问题