En ruby, ¿cuál es el motivo de include
es privado, mientras que Object#extend
es público?En ruby, ¿por qué incluir es privado y extender es público?
Respuesta
Object#extend
tiene para ser público, de lo contrario no podrá usarlo. Después de todo, su propósito es mezclar un módulo en un objeto, por lo que generalmente lo llamarías como obj.extend(Foo)
, que no es posible con métodos privados.
Module#include
generalmente se utiliza solamente dentro de un cuerpo del módulo, así:
class Bar
include Foo
end
es decir, por lo general se llama sin un receptor, por lo que no tiene que ser público. Por supuesto, no es tener para ser privado tampoco.
Mi conjetura es la razón por la que es privado es que es más invasiva, ya que cambia el comportamiento de cada instancia de Bar
, mientras que Object#extend
sólo se cambia un solo objeto. Por lo tanto, Module#include
es en cierto sentido "más peligroso" y por lo tanto se hace privado.
No sé si esa es la verdadera razón, pero es consistente con otros métodos similares como Module#define_method
.
No * tiene * que ser. Podrías usarlo si fuera privado: 'obj.send (: extender, Foo)', 'obj.instance_eval {extender Foo}', sin incluir el caso de los módulos 'clase Bar; extender Foo; end' –
@ Marc-AndréLafortune: O clase '<< obj; extender Foo; fin', por supuesto. Como dije, es solo una suposición. –
que estaba respondiendo a su primera frase "objeto' # extend' tiene que ser público, de lo contrario no sería capaz de usarlo." –
Para poder ejecutar Foo.include(Bar)
en cualquier punto, lo más probable es que sea una fuente de errores muy desagradables.
Como complemento a la respuesta de Jörg W Mittag, objeto # extienden también se puede utilizar para incluir métodos de instancia del módulo que se utilizará en el nivel de clase (que también estará disponible para todas las instancias de esa clase):
module Foo
def bar (baz)
end
end
class Qux
extend Foo
bar 'asdf'
end
- 1. ¿Cuál es la diferencia entre incluir y extender en Ruby?
- 2. Por qué InitializeComponent es público
- 3. ¿Cuál es la diferencia entre "incluir módulo" y "extender módulo" en Ruby?
- 4. ¿Es portable el uso público de typedef privado?
- 5. ¿Por qué no es privado el constructor de String()?
- 6. Ejemplo de encabezado privado/público?
- 7. Privado o público MSMQ
- 8. ¿Qué es Object :: private y Object :: public en Ruby?
- 9. ¿cómo público es un repositorio público github?
- 10. ¿Por qué no es posible extender anotaciones en Java?
- 11. C# anular miembro público y hacerlo privado
- 12. Privado vs público en Cache-Control
- 13. módulos Ruby y extender auto
- 14. ¿Qué es un "encabezado privado" en C?
- 15. ASP.NET MVC: ¿Por qué `ToMvcHtmlString` no es público?
- 16. ¿qué es "$:" en ruby?
- 17. ¿Por qué el constructor de java.io.FileDescriptor es público?
- 18. C++ ¿Es privado realmente privado?
- 19. Bloque privado/protegido en Ruby?
- 20. plantillas de django: incluir y extender
- 21. ¿Qué es .inc y por qué usarlo?
- 22. Una visión pragmática en privado vs público
- 23. ruby include vs extender
- 24. ¿por qué ruby scanf es tan lento?
- 25. ¿Qué es un módulo de objeto público en VBA?
- 26. ¿Es privado un campo C# por defecto?
- 27. Servidor de repositorio SVN público o privado?
- 28. Objective-C - Privado vs Protegido vs Público
- 29. ¿Por qué hacer que un miembro privado de la clase interna sea público en Java?
- 30. ¿Qué es "p" en Ruby?
¡Gracias por sus respuestas! –