0

私はこのようなコンストラクターを持っています:

function p = class_name(folder, file_name)

    xmlfile = fullfile(folder, file_name);
    xDoc = xmlread(xmlfile);

        struct = xml2struct(xDoc);

        %lots of repetitive code

end

XMLファイルを読み取り、構造体に変換します。次に、構造体要素は、次のような繰り返しコードを使用して、クラスのプロパティ/フィールドに割り当てられます。

if(isfield(struct.parameters, 'parameter_name'))
    p.property_name = struct.parameters.parameter_name.Text;
else
    p.property_name = '';
end

これをメソッド/関数に入れたいと思います。構造体要素の名前(ここでは「parameter_name」)とクラスフィールド/プロパティの名前(ここでは「property_name」)を指定すると、前者が後者に割り当てられます。

このためのジェネリック関数/メソッドを書くことは可能ですか?ありがとう。

4

3 に答える 3

4

このような関数は、動的フィールド名を使用して実装できます。これは、このような場合に推奨される実装です。

function p = setparam(s, p, param_name, prop_name)
    if(isfield(s.parameters, param_name))
       param = s.parameters.(param_name);
       p.(prop_name) = param.Text;
    else
       p.(prop_name) = '';
    end
end

古いバージョンのMATLABでsetfieldとgetfieldを使用することもできます。

function p = setparam(s, p, param_name, prop_name)
    if(isfield(s.parameters, param_name))
        param = getfield(s.parameters, param_name);
        p = setfield(p, prop_name, getfield(param, 'Text'));
    else
        p = setfield(p, prop_name, '');
    end
end

コードの構造体名にstructを使用しないでください。これは予約済みのキーワードです。

于 2012-09-12T09:35:57.787 に答える
1

動的フィールド名を使用します。

yourStruct.parameters.('parameter_name')
于 2012-09-12T09:50:46.510 に答える
0

ジェネリック関数は次のとおりです。構造体またはクラスオブジェクトのいずれかに使用できます

function obj_to = set_props(obj_to, obj_from)
% insert properties from obj_from into obj_to. 
props_from = fieldnames(obj_from);
props_to = fieldnames(obj_to);
for k = 1 : length(props_to)
    if ismember(props_to{k}, props_from)
        obj_to.(props_to{k}) = obj_from.(props_to{k});
    else
        obj_to.(props_to{k}) = '';
    end
end

さて、コンストラクターで:

function obj = class_name(folder, file_name)
    xmlfile = fullfile(folder, file_name);
    xDoc = xmlread(xmlfile);
    s = xml2struct(xDoc); % do not use word "struct" for variables
    set_props(obj, s);    % if obj has handle, no need to return it from set_props()
end
于 2012-09-13T18:30:15.273 に答える