Gambas-it

Gambas3 => Programmazione => Topic aperto da: Orionis - 04 Giugno 2014, 23:16:58

Titolo: Istanza BYREF di un elemento di Collezione
Inserito da: Orionis - 04 Giugno 2014, 23:16:58
Nello sviluppo del  mio progetto ho scoperto una cosa perlomeno curiosa, a meno che io non abbia capito niente di Collezioni.
Esempio di codice:

Codice: [Seleziona]
'esiste altrove una Classe pubblica clsElementi 
Public cLista As Collection  'collezione di classi clsElementi
Private $cElemento as clsElementi 'dichiaro un elemento della Collection
....
$cElemento = New clsElementi
....
$cElemento = cLista["chiave"]

Fin qui tutto bene; $cElemento è una copia dell'elemento [chiave] nella collezione.
Però mi aspetterei che $cElemento sia, come detto, una copia instanziata per valore e non per referenza.
Questo è forse il mio errore 'ideologico'

In realtà, $cElemento è una copia per referenza, tant'è che se io modifico i contenuti di $cElemento questi sono immediatamente riflessi nella Collezione originaria.

Se questo è confermato, non sono certo che sia il comportamento corretto; è vero che semplifica la vita in quanto non è necessario fare l'assegnazione inversa (cLista["chiave"] = $cElemento) per registrare la modifica, però in questo modo si possono generare degli effetti collaterali subdoli.

Non so se sono stato chiaro nell'esposizione, ma se qualcuno ha delucidazioni da fornire è benaccetto.
Titolo: Re: Istanza BYREF di un elemento di Collezione
Inserito da: Gianluigi - 05 Giugno 2014, 10:46:04
Nello sviluppo del  mio progetto ho scoperto una cosa perlomeno curiosa, a meno che io non abbia capito niente di Collezioni.
Esempio di codice:

Codice: [Seleziona]
'esiste altrove una Classe pubblica clsElementi 
Public cLista As Collection  'collezione di classi clsElementi
Private $cElemento as clsElementi 'dichiaro un elemento della Collection
....
$cElemento = New clsElementi
....
$cElemento = cLista["chiave"]

Fin qui tutto bene; $cElemento è una copia dell'elemento [chiave] nella collezione.
Però mi aspetterei che $cElemento sia, come detto, una copia instanziata per valore e non per referenza.
Questo è forse il mio errore 'ideologico'

In realtà, $cElemento è una copia per referenza, tant'è che se io modifico i contenuti di $cElemento questi sono immediatamente riflessi nella Collezione originaria.

Se questo è confermato, non sono certo che sia il comportamento corretto; è vero che semplifica la vita in quanto non è necessario fare l'assegnazione inversa (cLista["chiave"] = $cElemento) per registrare la modifica, però in questo modo si possono generare degli effetti collaterali subdoli.

Non so se sono stato chiaro nell'esposizione, ma se qualcuno ha delucidazioni da fornire è benaccetto.



Ciao Orionis,
vedo che insisti con domandine facili facili  :o
Purtroppo io sulle strutture come già ho avuto modo di dire non ci capisco nulla.

Mi ricordo che avevo iniziato (solo iniziato però) a studiarle circa sette anni fa su vb.net e se mi ricordo qualcosa era appunto che mi avevano mandato in tilt i famosi quattro neuroni.

In net (non inorridire) era più o meno così (?!): classe = dato passato per riferimento; tipo = dato passato per valore; riferimento = eredità; valore = no eredità, però se usavi le strutture saltava tutto o quasi.

Ciò detto a questa domanda qui in questo forum ti può rispondere solo chi non risponde più.  :-\  :'(

Ti consiglio di girare la domanda a M. Benoit Minisini e cioè nella MLU.

Scusa tanto ma modestamente la mia ignoranza a volte tocca vette che voi umani...  ;D

PS: Non sarebbe male un tuo scritto sull'argomento una volta che ti sei schiarito gli ultimi dubbi.

...attendo fiducioso... sanmidi
Titolo: Re: Istanza BYREF di un elemento di Collezione
Inserito da: vuott - 05 Giugno 2014, 18:37:56
.... se qualcuno ha delucidazioni da fornire è benaccetto.

Nell'attesa di altre risposte qui, e con spirito ecumenico ed univarsale ho posto questa tua questione nel forum della Comunità ispanica dei programmatori Gambas.
Ho avuto una prima risposta che così traduco:

" Ritengo che sia coerente. In Gambas tutti gli oggetti vengono passati per "Riferimento" e presto ci si abitua a pensare così.
Se non ti piace, puoi utilizzare semplicemente il metodo .Copia() della Collezione, ossia:

Codice: gambas [Seleziona]
Public cLista As Collection  'collezione di classi clsElementi
Private $cElemento as clsElementi 'dichiaro un elemento della Collection
....
dim copyclista as Collection

copylista = cLista.Copy

$cElemento = New clsElementi
....
$cElemento = copylista["chiave"]
 
'...etc.


saluti "