在Ruby中访问对象中的实例变量的常规方法是什么?

时间:2011-01-18 04:46:12

标签: ruby conventions instance-variables

请考虑以下代码:

class Dog
  attr_accessor :name, :color

  def initialize(name, color)
  end
end

在Ruby对象中,是直接访问实例变量的约定(即@name = name)还是使用setter / getter方法(即name = name)?

前者对我来说更清楚,但是如果你实现自己的setter / getter方法(例如同时增加一个类变量)那么你最终必须使用这两种方法(即@name = name ; color = color

Ruby社区的惯例是什么?我应该如何编写我的代码,让其他人阅读它?

3 个答案:

答案 0 :(得分:6)

使用name = value是一个错误,因为它会创建一个名为name的局部变量。您必须使用self.name = value

至于惯例,如果您可以保证访问者总是是轻量级@name,那么您只能使用attr_accessor。在所有其他情况下,使用@name而不是self.name会违反封装并让自己头疼。您在问题中给出了确切的原因 - 如果getter / setter中有额外的逻辑,如果直接访问实例变量,则必须复制它。

答案 1 :(得分:1)

这将是@name。这不仅仅是一个惯例。 @符号将变量的范围定义在其定义的对象的实例中。

答案 2 :(得分:1)

我相信,你所做的是最传统的方式。

实际上attr_accessor为读写创建了两个实例方法。它创建了两种方法,如:

def color() #getter
  @color
end

def color=(color) #setter
  @color = color
end

像color = color之类的东西不会起作用,因为如果在赋值的左边找到颜色,那么颜色将被视为局部变量。你可以使用self.color = color。 同样,如果颜色不在任何表达式的左侧,它将正常工作,如下所示:

def show_color
  puts color
end