class Example
private
def example_test
puts 'Hello'
end
end
e = Example.new
e.example_test
Por supuesto, esto no va a funcionar, porque especificamos receptor explícita - caso del ejemplo (e
), y que está en contra de una "regla privada".métodos Comprensión particulares en Rubí
pero no puedo entender, ¿por qué no se puede hacer en Ruby esto:
class Foo
def public_m
self.private_m # <=
end
private
def private_m
puts 'Hello'
end
end
Foo.new.public_m
El objeto actual en el interior public_m
definición del método (es decir self
) es la instancia de Foo. Entonces, ¿por qué no está permitido? Para arreglarlo tengo que cambiar self.private_m
a solo private_m
. Pero ¿por qué esto difiere, no es el self
una instancia de Foo dentro de public_m
? ¿Y quién es el receptor de la palabra desnuda private_m
llamada? ¿No es eso self
- lo que en realidad se omite porque, Ruby lo hará por usted (llamará private_m en sí mismo)?
Espero no haberlo confundido demasiado, todavía estoy fresco para Ruby.
EDIT: Gracias por todas las respuestas. Poniéndolos todos juntos pude (finalmente) asimilar lo obvio (y no tan obvio para alguien, que nunca había visto cosas como Ruby): ese self
mismo puede ser receptor explícito e implícito y eso hace la diferencia. Entonces, hay dos reglas, si desea llamar a un método privado: self
debe ser un receptor implícito, y ese auto debe ser una instancia de la clase actual (Example
en ese caso, y eso tiene lugar solo cuando está dentro de la definición del método de instancia, durante esta ejecución del método). Por favor, corríjame si estoy equivocado.
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
mensaje para cualquier persona que podría encontrar esta pregunta durante los senderos de Google: esto puede ser útil - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby
[Aquí] (http://stackoverflow.com/questions/1565269/are-there-good-reasons-for-private-to -work-the-way-it-do-in-ruby) es una pregunta muy similar. – demas