Existem boas razões para o 'privado' funcionar da maneira como funciona em Ruby?
Levei um tempo para entender comoprivado métodos funcionam em Ruby, e realmente me parece muito estranho. Alguém sabe se há boas razões para os métodos privados serem manipulados como eles são? São apenas razões históricas? Ou razões de implementação? Ou existem boas razões lógicas sólidas (ou seja, semântica)?
Por exemplo:
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
O comportamento de Ruby nas linhas (1), (2) e (5) parece razoável.O fato de (6) estar bem é um pouco estranho, especialmente vindo de Java e C ++. Alguma boa razão para isso?Eu realmente não entendo porque (3) falha! Uma explicação, alguém?O problema on line (4) parece uma ambigüidade na gramática, que nada tem a ver com 'privado'.Alguma ideia?