我对如何在matlab中使用句柄对象作为属性感到困惑.例如,我定义了以下类:
classdef Page < handle
properties
word1;
word2;
end
classdef Book < handle
properties
page1 = Page;
page2 = Page;
end
Run Code Online (Sandbox Code Playgroud)
现在我实例化两本书:
iliad = Book;
odyssey = Book;
Run Code Online (Sandbox Code Playgroud)
如果我检查iliad和odyssey是否相同:
eq(iliad, odyssey)
Run Code Online (Sandbox Code Playgroud)
我明白了:
ans = logical 0
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好
但是,如果我检查iliad和odyssey的page1是否相同:
eq(iliad.page1, odyssey.page1)
Run Code Online (Sandbox Code Playgroud)
我明白了:
ans = logical 1
Run Code Online (Sandbox Code Playgroud)
这个不好!这意味着如果我改变odyssey的page1,iliad的page1也会改变.我有什么误会?我该如何处理这个问题?
这似乎与MATLAB如何评估属性默认值有关.根据属性包含对象的文档:
MATLAB®仅在加载类时评估属性默认值一次.每次创建该类的对象时,MATLAB都不会重新评估赋值.如果在类定义中将对象指定为默认属性值,则MATLAB在加载类时仅调用该对象的构造函数一次.
它继续进一步指出:
仅在首次需要该值时才会对属性默认值进行评估,而在MATLAB首次初始化该类时仅进行一次.每次创建类的实例时,MATLAB都不会重新评估表达式.
其中描述了您在书籍之间看到的平等.MATLAB本质上是缓存类定义,因此虽然您的Page对象在本书中是不同的,但它们在书中会相同,因为MATLAB只构造一次默认值.
为避免这种情况,您可以Page在Book构造函数中实例化对象:
classdef Book < handle
properties
page1
page2
end
methods
function self = Book()
self.page1 = Page;
self.page2 = Page;
end
end
end
Run Code Online (Sandbox Code Playgroud)
这给了你想要的行为:
>> iliad = Book;
>> odyssey = Book;
>> eq(iliad.page1, odyssey.page1)
ans =
logical
0
Run Code Online (Sandbox Code Playgroud)