有人可以解释在定义类时初始化“self”和使用@variables 之间的区别吗?
这是一个例子
class Child < Parent
def initialize(self, stuff):
self.stuff = stuff
super()
end
end
所以在这种情况下,我不能用 替换self.stuff吗@stuff?有什么不同?另外,这super()只是意味着在 Parent 初始化方法中的任何内容,Child 都应该继承它,对吗?
有人可以解释在定义类时初始化“self”和使用@variables 之间的区别吗?
这是一个例子
class Child < Parent
def initialize(self, stuff):
self.stuff = stuff
super()
end
end
所以在这种情况下,我不能用 替换self.stuff吗@stuff?有什么不同?另外,这super()只是意味着在 Parent 初始化方法中的任何内容,Child 都应该继承它,对吗?
一般来说,没有,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
self.stuff=除非您专门创建attr_writer用于修改该值的值,否则您实际上无法使用。
事实上,这些是等价的:
class Child
attr_writer :stuff
end
class Child
def stuff=(val)
@stuff = val
end
end
更常见的是使用attr_writerif 那是您想要的功能,而不是显式方法。但是,如果您想执行额外的错误检查或更改分配的工作方式,您通常会使用显式方法。
对于您何时使用@stuff =和何时使用的问题self.stuff =,如果您只有简单的作业并且您的课程很简单,我会使用前者,如果您的要求可能变得更复杂,我会转向后者。还有很多其他原因,但这更多的是风格问题。