我是Free Pascal和Lazarus的新手。我正在測試新的「高級記錄」功能,並獲得看起來不必要的編譯器警告。拉撒路(Free Pascal)。看似不必要的編譯器警告
該代碼非常簡單,只是一個記錄用一個方法來初始化數據字段。喜歡的東西:
{$mode delphi}
type TTest =
record
a,b: double;
procedure Init(x,y: double);
end
procedure TTest.Init(x,y: double);
begin
test.a := x;
test.b := y;
end;
var t: TTest;
begin
t.Init(0.1,0.2);
所示最後一行,「t.Init()」,總是生成編譯器警告「變量‘t’似乎並沒有被初始化」。
好吧,這只是警告,顯然我可以忍受它,但我只是想確保它不是由於我的一些根本的誤解。
編輯添加新信息。
重新方法verus構造函數點。 深入探討這一點,我很高興FPC不允許構造函數進行記錄。 Delphi具有構造函數,但沒有析構函數,就我可以告訴構造函數(用於記錄)而言,絕對沒有方法無法完成的工作。我是一個極簡主義者,所以對我來說,沒有任何意義可以使用額外的語法,它只不過是一些現有的語法。
特別是對於這樣一個簡單的記錄,聲明它的行爲(var t:TTest)完成了構建該記錄所需的所有工作。其他任何東西(比如我的Init)只是設置值,它不會構造任何東西。所以就我所見,構造函數不是答案,編譯器只需要放下警告。
研究問題我遇到了另一種經常使用的技術,即所謂的「工廠功能」。也就是說,一個函數外記錄的如:
function InitTTest(x,y: double): TTest;
begin
Result.a := x;
Result.b := y;
end;
這種技術確實工作,並擺脫了警告消息。我不喜歡這種方法,但我不會使用它。高級記錄沒有繼承和類的其他功能,封裝是他們爲他們所做的一切。所以我真的不喜歡在這樣的記錄之外建立一個「工廠職能」。
請記住,以上只是一個「noob」的意見,經過一些小小的研究後回答我自己的問題。所以如果我對上述任何事情都有錯,我很樂意予以糾正。 :)
那麼在技術上,警告* *是正確的 - 你*的*使用' t'沒有被初始化。編譯器不知道你將要使用'Init'方法來設置記錄(我想它可以算出來,但對於更復雜的記錄看起來像很多工作)。我想這是構造函數的用途,但我在FreePascal上有點生疏,所以我不確定記錄是否可以具有構造函數(從技術角度而言)。 – Thomas 2013-03-16 07:45:32
謝謝托馬斯。是的,我總是在使用類時使用構造函數,但不使用記錄,因爲它們不像類那樣動態「實例化」。但是你是對的,這些新記錄可以有構造函數,所以我會嘗試並報告回來。 – Stuart 2013-03-16 08:01:22
只需更新我的發現使用構造函數。顯然Delphi允許記錄具有構造函數,但不包含FPC。我只是測試了將Init()從一個過程改變爲一個構造函數,並且它給出了消息「**錯誤:構造函數在記錄或記錄助手中不允許。**」。所以我想這不是答案。 – Stuart 2013-03-16 08:09:01