Ruby类:初始化self vs. @variable
有人可以解释在定义类时初始化“self”和@variables之间的区别吗?
这是一个例子
class Child < Parent def initialize(self, stuff): self.stuff = stuff super() end end
那么在这种情况下,我不能用@stuff
替换@stuff
吗? 有什么不同? 另外, super()
只是表示Parent初始化方法中的Child应该只是inheritance它吗?
一般来说,不, self.stuff = stuff
和@stuff = stuff
是不同的。 前者在对象上调用stuff=
,而后者直接设置实例变量。 前者调用一个可能是公共的方法(除非在类中特别声明为private),而后者总是设置一个私有实例变量。
通常,它们看起来一样,因为在类上定义attr_accessor :stuff
是很常见的。 attr_accessor
大致相当于以下内容:
def stuff @stuff end def stuff=(s) @stuff = s end
所以在这种情况下,它们在function上是相同的。 但是,可以定义公共接口以允许不同的结果和副作用,这将使这两个“任务”明显不同:
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
如果这是您想要的function,而不是显式方法,则更常见的是使用attr_writer
。 但是,如果要执行额外的错误检查或更改赋值的工作方式,通常会使用显式方法。
关于何时使用@stuff =
以及何时使用self.stuff =
,如果你只有简单的作业,如果你的课很简单,我会使用前者,如果你的要求可能变得更复杂,我会使用前者。 还有很多其他原因,但它更多的是风格问题而不是其他任何问题。