Czy istnieją powody, dla których „prywatny” działa tak, jak w Ruby?
Trochę mi zajęło zrozumienieprywatny metody działają w Ruby i naprawdę wydaje mi się, że jest bardzo niezręczna. Czy ktoś wie, czy istnieją dobre powody, aby prywatne metody były traktowane tak, jak są? Czy to tylko powody historyczne? Czy powody wdrożenia? A może istnieją dobre, logiczne powody (np. Semantyczne)?
Na przykład:
class Person
private
attr_reader :weight
end
class Spy < Person
private
attr_accessor :code
public
def test
code #(1) OK: you can call a private method in self
Spy.new.code #(2) ERROR: cannot call a private method on any other object
self.code #(3) ERROR!!! cannot call a private method explicitly on 'self'
code="xyz" #(4) Ok, it runs, but it actually creates a local variable!!!
self.code="z" #(5) OK! This is the only case where explicit 'self' is ok
weight #(6) OK! You can call a private method defined in a base class
end
end
Zachowanie Ruby na liniach (1), (2) i (5) wydaje się rozsądne.Fakt, że (6) jest w porządku, jest nieco dziwny, zwłaszcza pochodzący z Java i C ++. Jakiś dobry powód?Naprawdę nie rozumiem dlaczego (3) zawodzi! Ktoś wyjaśnia?Problem w linii (4) wygląda jak dwuznaczność w gramatyce, która nie ma nic wspólnego z „prywatnym”.Jakieś pomysły?