我是Free Pascal和Lazarus的新手。我正在测试新的“高级记录”功能,并获得看似不必要的编译器警告。
代码非常简单,只是一个记录,只有一个方法来初始化数据字段。类似的东西:
{$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”的意见,经过一些研究来回答我自己的问题。所以如果我对上述任何事情都错了,我很乐意纠正。 :)
答案 0 :(得分:3)
是的,这就是构造函数的用途,下面用FPC trunk 编译并且不会产生警告:
{$mode delphi}
type TTest =
record
a,b: double;
constructor Init(x,y: double);
end;
constructor TTest.Init(x,y: double);
begin
a := x;
b := y;
end;
var t: TTest;
begin
t.Init(0.1,0.2);
end.