请考虑以下代码:
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社区的惯例是什么?我应该如何编写我的代码,让其他人阅读它?
答案 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