2011-11-10 4 views
8

Estoy tratando de entender un poco más sobre las clases de Matlab y sus propiedades. Aquí está una clase de prueba que he creado:¿por qué las propiedades no toman un nuevo valor del método de clase?

classdef Test  
    properties 
     % Properties of the network type 
     some_var 
    end 

    methods 
     function N = Test() 
     end 

     function change_var(N, val) 
      N.some_var=val; 
     end 
    end 
end 

Ahora, crear una instancia de esta clase, y pedirá "change_var()" ...

>> a=Test; 
>> a.change_var(2); 
>> a.some_var 

ans = 

    [] 

¿Por qué tiene la propiedad "una_variable" no tomado en el valor "val" en la tarea?

+0

véase [clases de MATLAB: mango o valor] (http://stackoverflow.com/questions/6436539/matlab-classes-handle-or- valor) para una discusión de clases de manejo frente a valor. –

Respuesta

11

La clase Test se ha definido como value-class as opposed to a handle class. Efectivamente, cuando llama al a.change_var, a se transfiere por valor. Para almacenar el cambio en la propiedad some_var hacer esto:

 
>> a = Test; 
>> a = a.change_var(2); 

La alternativa es hacer una clase Test mango en cuyo caso el ejemplo en su pregunta podría funcionar como se esperaba. Para ello, se hereda de la clase handle cambiando la primera línea de la definición de clase a esto:

 
classdef Test < handle 
+0

¡bingo! eso funcionó perfectamente, muchas gracias :) Tengo que esperar 4 minutos para seleccionar esto como la respuesta, pero lo haré – gnychis

+4

Es importante mencionar que una vez que la clase se convierte en ** manejar **, las variables a las que se asignó esta clase se convierten en referencia al mismo objeto en la memoria. Cambiar una propiedad en una de esas variables cambiará el valor de la propiedad en las otras de manera similar a la referencia del objeto en C# por ejemplo. – Celdor

3

El método proporciona una manera de cambiar la propiedad, pero también se debe devolver el objeto. Tendrá que modificar su método como:

function N = change_var(N, val) 
    N.some_var=val; 
end 

Tenga en cuenta que la función devuelve el objeto modificado. A continuación, tendrá que actualizar a con el cambio como:

a = a.change_var(2); 
+2

Para ser claros: el ejemplo que se muestra aquí es para una clase de objeto de valor (es decir, no es un objeto de control), y no cambia la propiedad del objeto original per se. La función recibe una _copia_ del objeto original en el argumento N, modifica la propiedad some_var de ese objeto y devuelve la copia modificada del objeto. – gwideman

Cuestiones relacionadas