1

我是 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”似乎没有被初始化”。

好的,这只是警告,所以显然我可以忍受它,但我只是想确保这不是由于我的一些潜在的误解。


编辑以添加新信息。

重新方法与构造函数点。再看看这个,我很高兴 FPC 不允许构造函数进行记录。Delphi 有构造函数但没有析构函数,据我所知,构造函数(用于记录)绝对没有做任何方法不能做的事情。我是一个极简主义者,所以对我来说,没有任何意义的额外语法只做一些现有的语法。

特别是对于像这样的简单记录,声明它的行为(var t: TTest)完成了该记录所需的所有“构造”。其他任何东西(比如我的 Init)都只是设置值,它并没有构建任何东西。所以据我所见,构造函数不是答案,编译器只需要删除警告。

在研究这个问题时,我遇到了另一种经常使用的技术,即所谓的“工厂函数”。即记录之外的函数,例如:

function InitTTest(x,y: double): TTest;
begin
  Result.a := x;
  Result.b := y;
end;

这种技术确实有效,并且消除了警告信息。但是我不喜欢这种方法,我不会使用它。高级记录没有类的继承和其他特性,封装就是它们的全部功能。所以我真的不喜欢像这样在唱片之外制作一个“工厂功能”。

请记住,以上只是一个“菜鸟”的意见,在这里做了一些研究来回答我自己的问题。因此,如果我对上述任何内容有误,我很高兴得到纠正。:)

4

1 回答 1

3

是的,这就是构造函数的用途,以下代码使用 FPC主干编译并且不产生警告:

{$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.
于 2013-03-16T18:24:20.677 回答