classdef Dog < handle
properties
data;
end
methods
function self = Dog(varargin)
disp("Dog()")
end
function out = new(~)
out = Dog();
out('bark') = 1;
end
end
end
d=Dog(); 為什么在d.new()下面列印?
Dog()
Dog()
Dog()
subsref如果我超載它也會繞過它。進入d控制臺給出
ans =
1×114 Dog array with properties:
data
并且不與d('bark') = 1.
如果我擺脫 ,行為會發生變化varargin,而不是出現錯誤。還有為什么1x114?
uj5u.com熱心網友回復:
d.new()這是呼叫(之后)時發生的情況d = Dog():
out = Dog();被呼叫。此建構式呼叫觸發“Dog()”的第一個輸出out('bark') = 1;被呼叫,這會觸發以下內容:- 的字符
'bark'被解釋為值[98 97 114 107 ]。因此,Matlab 將大小調整out為 114。 - 為了構造一個
Dog物件來填充位置[98 97 114 107 ],outMatlab 再次呼叫建構式,這次輸入引數varargin等于{ 1 }。這會觸發“Dog()”的第二個輸出。 - 為了構造一個
Dog物件來填充 中的其他位置out,Matlab 再次呼叫建構式,這次沒有輸入引數。這會觸發“Dog()”的第三個輸出。
- 的字符
此外,subsref不會被繞過,但根本不會被呼叫,因為您沒有以閱讀方式參考物件。
并且當您洗掉時varargin,您會收到錯誤,因為無法再使用一個輸入引數呼叫建構式,如上面 2. 下的第二個要點中所述。
uj5u.com熱心網友回復:
據我了解,在類方法中,索引運算式始終使用內置的subsasgnand subsref,而不是您可能自己撰寫的多載(自定義)運算式。這樣多載這些函式不會洗掉類方法訪問物件屬性的能力。
因此,在您的類方法中,out(i)訪問i陣列中的第 th 個物件out。這不是out.data(i),out真的是類的物件陣列Dog。Dog()創建一個 1x1 陣列,您通常會將其視為一個物件,但它實際上是一個陣列。MATLAB 中的一切都是陣列!
現在為out('bark') = 1. 'bark',正如user16372530 的 anwser所解釋的,是一個 4 元素陣列,具有數值[98 97 114 107]。因此out,從您的自定義類的 1x1 陣列開始,調整大小為 114 個元素的陣列,以及您分配的 4 個元素1。在這里,MATLAB 需要創建一個空元素來填充 113 個新元素,因此呼叫Dog()一次并將結果復制到每個元素。然后它需要轉換1為您的類,因此呼叫Dog(1)這樣做,并將結果復制到 4 個索引元素。實際上,正如下面評論中的 user16372530 所示,首先1轉換然后創建空物件。
如果您希望您的類方法使用多載索引運算子,則需要顯式呼叫subsasgnor subsref,這很難看且難以閱讀。據我了解,實際上沒有辦法在類方法中使用類物件,因為您實際上打算使用您的類。相同的代碼在類方法內部和外部的行為不同。
MATLAB OOP 有一些非常有趣的特性,但它也有很多奇怪和不方便的東西。我猜他們在以前存在的 MATLAB 陣列語法中盡了最大的努力設計了一個自定義類系統。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/505853.html
標籤:matlab
