はじめに
Matlabでは、オブジェクトのプロパティを
可変にする場合、handleクラスを継承して書き始めます。
まず下のようなクラスファイルを準備してみてください。
SpecializedCopy.m
classdef SpecializedCopy < handle
properties
Prop1
Prop2 = datestr(now)
end
methods(Access = protected)
function cp = copyElement(obj)
cp = SpecializedCopy;
cp.Prop1 = obj.Prop1;
cp.Prop2 = datestr(now);
end
end
end
そのあとで、次のように実行していくと、
matlabのhandleクラスが参照渡しであることがわかります。
>> a = SpecializedCopy
a =
SpecializedCopy with properties:
Prop1: []
Prop2: '29-Jun-2017 10:54:19'
>> a.Prop1 = 'not copyable';
>> b = a
b =
SpecializedCopy with properties:
Prop1: 'not copyable'
Prop2: '29-Jun-2017 10:54:19'
>> b.Prop1 = 'change a property'
b =
SpecializedCopy with properties:
Prop1: 'change a property'
Prop2: '29-Jun-2017 10:54:19'
>> a
a =
SpecializedCopy with properties:
Prop1: 'change a property'
Prop2: '29-Jun-2017 10:54:19'
オブジェクトの値渡し
参照渡しをすると、コピーしたはずのオブジェクトのpropertyを書き換えたとき、
元々のオブジェクトのプロパティも書き換わり望ましくない挙動をすることがあります。
そこで、値渡しの出番です。
handle
クラスの代わりに、matlab.mixin.Copyable
を
継承してクラスを書けば実現できます。
実装・実行例
クラスファイルをまず下のように書きます。
SpecializedCopy.m
classdef SpecializedCopy < matlab.mixin.Copyable
properties
Prop1
Prop2 = datestr(now)
end
methods(Access = protected)
function cp = copyElement(obj)
cp = SpecializedCopy;
cp.Prop1 = obj.Prop1;
cp.Prop2 = datestr(now);
end
end
end
コンソールにて、下のように実行すれば、オブジェクトをコピーすると
値渡しが実現出来ていることが確認できると思います。
>> a = SpecializedCopy;
>> a
a =
SpecializedCopy with properties:
Prop1: []
Prop2: '29-Jun-2017 10:50:58'
>> a.Prop1 = 'copyable';
>> b = copy(a)
b =
SpecializedCopy with properties:
Prop1: 'copyable'
Prop2: '29-Jun-2017 10:51:19'
>> b.Prop1 = 'rewritten'
b =
SpecializedCopy with properties:
Prop1: 'rewritten'
Prop2: '29-Jun-2017 10:51:19'
>> a
a =
SpecializedCopy with properties:
Prop1: 'copyable'
Prop2: '29-Jun-2017 10:50:58'