Tengo una clase Pointer
con un solo atributo :contents
, que apunta a un objeto de la clase MyObject
.¿Qué método para definir en una clase de Ruby para proporcionar dup/clone para sus instancias?
class MyObject
def hello; "hello" end
end
class Pointer
attr_reader :contents
def initialize(cont); @contents = cont end
# perhaps define some more state
end
Quiero que mi Pointer
para ser capaz de hacer copias de sí mismo. Sé que el método #dup
se define de forma predeterminada, mientras que se espera que el método #clone
se sobrescriba para poder hacer copias en profundidad. Pero aquí, las copias no tienen que ser demasiado profundas. Entonces, el primer dilema que tengo es, ¿debo anular el método #dup
, porque realmente no quiero copiar el estado adicional de mi Pointer
, simplemente haga uno nuevo apuntando a la misma instancia MyObject
? ¿O debería abstenerme de omitir #dup
, porque no se "debería" y anular #clone
con un método de hacer copias superficiales?
Me gustaría recibir comentarios sobre lo anterior, pero digamos que elegiré anular #dup
. Podría hacer precisamente esto:
class Pointer
def dup; self.class.new(contents) end
end
Pero en línea, leí algo así como "el DUP método llamará al inicializar copiar método". Además, this guy escribe sobre #initialize_clone
, #initialize_dup
y #initialize_copy
en Ruby. Eso me deja pensando, ¿es la mejor práctica tal vez así?
class Pointer
def initialize_copy
# do I don't know what
end
end
¿Te gusta esto?
class Pointer
def initialize_dup
# do I don't know what
end
end
O debería olvidarse de diatribas en línea escritas para confundir a los principiantes e ir a por anulando #dup
sin preocupaciones?
Además, entiendo que solo puedo llamar #dup
sin definir ninguna costumbre #dup
, pero lo que si quiero definir #dup
con un comportamiento diferente?
Además, la misma pregunta se aplica a #clone
- ¿Debería tratar de definir #initialize_clone
o simplemente #clone
?
¿Puedo preguntar por qué usted está haciendo una clase de puntero en absoluto ? Las variables de Ruby ya son referencias/punteros. –
Algunas veces quiere implementar su propia estructura de datos o quiere que el puntero haga trucos. El objeto de la pregunta no es si la clase es un puntero u otra cosa, pero si debes saberlo, estoy interesado en las estructuras Zz de Ted Nelson, y Ted define lo que él llama "cursores", así que decidí llamarlos "puntos" "como en Emacs". Ya sabes, tienes que implementar la clase de puntero cuando la especificación de la estructura de datos lo requiera. –