class Example
private
def example_test
puts 'Hello'
end
end
e = Example.new
e.example_test
Bien sûr, ne fonctionnera pas, parce que nous avons spécifié récepteur explicite - par exemple de l'exemple (e
), et qui est contre une « règle privée ».Comprendre les méthodes privées dans Ruby
Mais je ne comprends pas, pourquoi on ne peut pas faire en Ruby ceci:
class Foo
def public_m
self.private_m # <=
end
private
def private_m
puts 'Hello'
end
end
Foo.new.public_m
L'objet courant à l'intérieur public_m
définition de la méthode (à savoir self
) est l'instance de Foo. Alors pourquoi est-ce interdit? Pour corriger cela, je dois changer self.private_m
juste private_m
. Mais pourquoi cela diffère, n'est pas le self
une instance de Foo à l'intérieur public_m
? Et qui est le destinataire de l'appel private_m
nu-mot? N'est-ce pas self
- qu'est-ce que vous omettez réellement parce que, Ruby le fera pour vous (appellera private_m on self)?
J'espère ne pas trop le confondre, je suis encore fraîche à Ruby.
EDIT: Merci pour toutes les réponses. En les mettant tous ensemble, j'ai pu (enfin) grok l'évidence (et pas si évident pour quelqu'un, qui n'a jamais vu des choses comme Ruby): que self
lui-même peut être récepteur explicite et implicite et qui font la différence. Donc il y a deux règles, si vous voulez appeler une méthode privée: self
doit être un récepteur implicite, et ce self doit être une instance de la classe actuelle (Example
dans ce cas) et cela n'a lieu que si self si dans la définition de méthode d'instance, pendant l'exécution de cette méthode). S'il vous plait corrigez moi si je me trompe.
class Example
# self as an explicit receiver (will throw an error)
def explicit
self.some_private_method
end
# self as an implicit receiver (will be ok)
def implicit
some_private_method
end
private
def some_private_method; end
end
Example.new.implicit
Message pour tous ceux qui pourraient trouver cette question au cours des pistes Google: cela peut être utile - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby
[ici] (http://stackoverflow.com/questions/1565269/are-there-good-reasons-for-private-to -work-the-way-it-does-in-ruby) est une question très similaire. – demas