Matlab - Handle对象属性的唯一对象是指同一个对象吗?

mat*_*ner 5 oop matlab

我对如何在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也会改变.我有什么误会?我该如何处理这个问题?

exc*_*aza 6

这似乎与MATLAB如何评估属性默认值有关.根据属性包含对象的文档:

MATLAB®仅在加载类时评估属性默认值一次.每次创建该类的对象时,MATLAB都不会重新评估赋值.如果在类定义中将对象指定为默认属性值,则MATLAB在加载类时仅调用该对象的构造函数一次.

它继续进一步指出:

仅在首次需要该值时才会对属性默认值进行评估,而在MATLAB首次初始化该类时仅进行一次.每次创建类的实例时,MATLAB都不会重新评估表达式.

其中描述了您在书籍之间看到的平等.MATLAB本质上是缓存类定义,因此虽然您的Page对象在本书中是不同的,但它们在书中会相同,因为MATLAB只构造一次默认值.

为避免这种情况,您可以PageBook构造函数中实例化对象:

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)