2017-08-15 23 views
1

假設我有一個一流的,我定義一個attr_accessor像這樣:使用私有attr_accessor時,爲什麼self.attribute =工作,但self.attribute不?

private 

attr_accessor :attribute 

我明白了爲什麼使用self.attribute閱讀方法不起作用 - 在Ruby中,你不能調用私有方法上明確的接收器。

我很困惑的是爲什麼這個規則不適用於作家?爲什麼我可以撥打self.attribute = 1,並且不會引發任何訪問衝突錯誤?

+0

沒有真正做任何研究,我猜想這是因爲需要'self.'來區分它分配一個局部變量。 –

+0

是的,我認爲它必須這樣做,因爲這一點。我想我很懷疑是否它是一個特殊情況來防止這種模糊的調用,或者是否有關於我不明白的允許它的對象模型。 –

+0

[爲什麼Ruby不允許我將自己指定爲私有方法中的接收方?](https://stackoverflow.com/questions/10811986/why-wont-ruby-allow-me-to-specify自己作爲一個接收者在一個私人的方法) –

回答

2

據@約爾格W¯¯米塔格阿蘭Skorkin的博客文章Ruby Access Control – Are Private And Protected Methods Only A Guideline?評論:

快速注:還有就是調用帶有明確的接收器私有方法是允許一個特殊情況:

如果方法名以'='結尾(即它是一個屬性編寫器)並且顯式接收者是'self',那麼這是有效的。這是必要的,因爲setter只能用明確的接收方調用,因爲方法/變量模糊。否則就不可能打私人電話。

Jörg沒有提供資料,但他很可靠。

相關問題