2012-01-09 15 views
5

Tengo un ejemplo de un programa que crea una matriz, y luego intenta asignar el valor de esa matriz varias veces en otra matriz como una matriz multidimensional.La asignación de matriz Powershell asigna variable, no valor?

$a [email protected](0,0,0) 
$b = @($a,$a,$a) 
$b[1][2]=2 
$b 
'And $a is changed too:' 
$a 

La salida es:

PS E:\Workarea> .\what.ps1 
0 
0 
2 
0 
0 
2 
0 
0 
2 
And $a is changed too: 
0 
0 
2 

lo tanto, en este caso, la variable apunta realmente a la variable original. Este es un comportamiento muy inesperado. Es bastante limpio que uno pueda hacer esto, aunque nunca utilicé tanto los sindicatos en mi programación C. Pero me gustaría una manera de hacer la asignación del valor, no de la variable.

$b = @($a.clone(),$a.clone(),$a.clone()) 

Supongo que funcionaría, pero algo me dice que puede haber algo un poco más elegante que eso.

Gracias por la entrada.

Esto es PowerShell 2.0 en Windows 7 de 64 bits.

Respuesta

4

Para asignar los valores de $a a $b en lugar de la referencia a $a, puede ajustar la variable en $(). Cualquier cosa en $() se evalúa antes de usarlo en el comando, por lo que $($a) es equivalente a 0, 0, 0.

$a [email protected](0,0,0) 
$b = @($($a),$($a),$($a)) 
$b[1][2]=2 
$b 
'$a is not changed.' 
$a 
+0

Gracias. Eso funciona. Simplemente no entiendo por qué una instancia de $ a = $ b le da el valor, y otra instancia le da la referencia. Especialmente cuando no hay garantía de que vas a obtener cuando $ b podría ser cualquier cosa. – bytehead

+2

Esto no es específico de PowerShell; es cómo .NET maneja la asignación de memoria para Clases (por referencia) vs. Estructuras (por valor). Los valores numéricos (int, double, etc.) también son por valor. Hay una buena explicación en http://www.albahari.com/valuevsreftypes.aspx. Y de Microsoft http://msdn.microsoft.com/en-us/library/t63sy5hs(v=VS.100).aspx – Rynant

+0

Gracias. Más lectura en la pila. – bytehead

1

Tenga cuidado en PowerShell ',' no es el operador del enumerador, sino un operador de matriz. Lo que presente como multidimensional array es en realidad un conjunto de matriz, se puede encontrar aquí en la definición de una matriz multidimensional:

$a= new-object ‘object[,]’ 3,3 
$a[0,2]=3 
PS > for ($i=0;$i -lt 3;$i++) 
>> { 
>> for($j=0;$j -lt 3;$j++) 
>> { 
>> $a[$i,$j]=$i+$j 
>> } 
>> } 

Todo funciona aquí como $b es una matriz de referencia.

+0

Estaba tratando de usar verdaderos arreglos multidimensionales, pero estaban volteando el pájaro cuando estaba tratando de usarlos. Evidentemente, todavía tengo un camino por recorrer para aprender los pormenores. Una matriz de matrices funciona para lo que estoy haciendo, de hecho, estaba pensando solo en usar una matriz plana. – bytehead

+0

Una matriz de matrices funciona para lo que estoy haciendo. De un ex programador de C, una matriz dimensional, bidimensional, de matrices, me da lo mismo. Esto todavía tiene el problema de asignarlo a $ b. Todavía es por referencia. Usar $ b = $ ($ a), y luego $ b [0,2] = 3 me da la asignación de Array a [0,2] error porque la asignación a sectores no es compatible. error. Eso no ocurre en mi ejemplo. Y odio que enter solo agregue el comentario, y la ventana de cinco minutos para editar apesta. Solo digo. N00b aquí. – bytehead

Cuestiones relacionadas