Ho una classe Pointer
con un singolo attributo :contents
, che punta a un oggetto della classe MyObject
.Quale metodo definire su una classe Ruby per fornire dup/clone per le sue istanze?
class MyObject
def hello; "hello" end
end
class Pointer
attr_reader :contents
def initialize(cont); @contents = cont end
# perhaps define some more state
end
voglio che il mio Pointer
per essere in grado di fare copie di se stesso. So che il metodo #dup
è definito per impostazione predefinita, mentre il metodo #clone
deve essere sostituito per poter eseguire copie approfondite. Ma qui, le copie non devono essere troppo profonde. Quindi, il primo dilemma che ho è, dovrei scavalcare il metodo #dup
, perché in realtà non voglio copiare lo stato aggiuntivo del mio Pointer
, basta crearne uno nuovo che punta alla stessa istanza MyObject
? O dovrei astenermi da overridine #dup
, perché non sono "supposto" ed eseguire l'override di #clone
con un metodo che esegue copie poco profonde?
Gradirei commenti su quanto sopra, ma supponiamo che sceglierò di sovrascrivere #dup
. Ho potuto fare proprio questo:
class Pointer
def dup; self.class.new(contents) end
end
Ma in linea, ho letto qualcosa come "il DUP metodo di chiamerà il inizializzare copiare metodo". Inoltre, this guy scrive su #initialize_clone
, #initialize_dup
e #initialize_copy
in Ruby. Questo mi lascia domandare, è forse la miglior pratica come questa?
class Pointer
def initialize_copy
# do I don't know what
end
end
O come questo?
class Pointer
def initialize_dup
# do I don't know what
end
end
O devo solo dimenticare sproloqui online Scritto per confondere i principianti e andare per superiori #dup
senza preoccupazioni?
Inoltre, capisco che posso solo chiamare #dup
senza definire alcuna consuetudine #dup
, ma cosa se voglio definire #dup
con un comportamento diverso?
Inoltre, la stessa domanda si applica a #clone
- devo provare a definire #initialize_clone
o solo #clone
?
Posso chiedere perché stai facendo una classe puntatore a tutti ? Le variabili di Ruby sono già tutti riferimenti/puntatori. –
A volte si desidera implementare la propria struttura dati o si desidera che il puntatore esegua trucchi. L'argomento della domanda non è se la classe è un puntatore o qualcos'altro, ma se devi sapere, sono interessato alle strutture Zz di Ted Nelson, e Ted definisce quelli che lui chiama "cursori", così ho deciso di chiamarli "punti" "come in Emacs. Sai, devi implementare la classe pointer quando le specifiche della struttura dati lo richiedono. –