一般來說,不,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
樓下,你會發現優秀的答案爲第一部分你的問題。當計算'super()'時,父類的初始化方法被調用時沒有任何參數。這是紅寶石中罕見的情況之一,您不能忽略簡單方法調用的括號。如果你這樣做,超類的初始化方法被稱爲**,並且你傳遞給'Child'類的初始化方法的參數**。 – rathrio
看起來你在Ruby和Python之間感到困惑(你是否想同時學習兩者?)在Ruby中,你不會在方法參數列表後加':',並且'initialize'不會獲得對「自我」的引用。在Python中,'self'被顯式地傳遞給構造函數(或者在Python中調用的任何東西),並且'initialize'方法看起來與它在Python中的外觀非常相似。在Ruby中,您始終可以引用'self'而不必將其明確地傳遞給方法。 –