2017-09-28 2 views
0

J'ai une question concernant les classes dans MATLAB.Utilisation des propriétés 'facultatives' dans une classe MATLAB

J'écris un analyseur, qui n'a pas toujours la même entrée. Certaines variables ne sont pas définies à tout moment. Voici un petit script maquette:

test_parser.m

classdef test_parser < matlab.mixin.Copyable 
    properties (AbortSet = true) 
     a 
     b   
    end 
end 

make_class.m

function result = make_class(array) 
    result = test_parser; 
    result.a = array(1); 
    if length(array)>1 
     result.b=array(2); 
    end 
end 

maintenant appeler depuis la fenêtre de commande avec différentes longueurs d'entrée:

>> make_class([10]) 
ans =  
    test_parser with properties:  
    a: 10 
    b: [] 

>> make_class([10,20])   
ans =  
    test_parser with properties:  
    a: 10 
    b: 20 

Dans les deux cas, la variable b est une propriété de test_parser, comme indiqué. Mon souhait serait que b soit optionnel, donc juste présent s'il y a b dans l'entrée.

Quelle est la meilleure façon d'y parvenir? Je suppose qu'un paramètre optionnel n'est pas vraiment une propriété?

+0

Si cela est purement pour des raisons esthétiques alors je dirais que la solution serait de garder le code propre (c'est le peu important!) Et au lieu de en se basant sur "l'absence de point-virgule" pour afficher la sortie, il suffit de créer une petite fonction pour afficher les valeurs de la classe. – Wolfie

Répondre

1

Si vous souhaitez des propriétés facultatives, vous pouvez hériter votre classe de dynamicprops. Vous pouvez ensuite ajouter des propriétés à la volée en utilisant la commande addprop, tester si une propriété existe en utilisant isprop et même répondre aux propriétés ajoutées ou supprimées en écoutant les événements PropertyAdded et PropertyRemoved.

Dans votre exemple, vous utiliserez alors:

classdef test_parser < matlab.mixin.Copyable & dynamicprops 
    properties (AbortSet = true) 
     a  
    end 
end 

function result = make_class(array) 
    result = test_parser; 
    result.a = array(1); 
    if length(array)>1 
     result.addprop('b') 
     result.b=array(2); 
    end 
end 

>> make_class([10]) 
ans = 
    test_parser with properties: 

    a: 10 
>> make_class([10,20]) 
ans = 
    test_parser with properties: 

    a: 10 
    b: 20 
+0

Celui-ci, c'est une bonne idée! Je vais essayer ça lundi. ;-) – Laenan