一般来说,没有,self.stuff = stuff
而且@stuff = stuff
是不同的。前者对对象进行方法调用stuff=
,而后者直接设置实例变量。前者调用一个可能是公共的方法(除非在类中明确声明为私有),而后者总是设置一个私有实例变量。
通常,它们看起来是一样的,因为attr_accessor :stuff
在类上定义是很常见的。attr_accessor
大致相当于以下内容:
def stuff
@stuff
end
def stuff=(s)
@stuff = s
end
所以在这种情况下,它们在功能上是相同的。但是,可以定义公共接口以允许不同的结果和副作用,这将使这两个“分配”明显不同:
def stuff
@stuff_called += 1 # Keeps track of how often this is called, a side effect
return @stuff
end
def stuff=(s)
if s.nil? # Validation, or other side effect. This is not triggered when setting the instance variable directly
raise "Argument should not be nil"
end
@stuff = s
end