在Delphi中,"&"运算符代表什么?

6

今天我决定在Delphi 10.2.3中使用TParallel.For,并成功地使用了它。

但是TParallel.For有一个奇怪的定义,这种定义对我来说是新的。而且我在Delphi文档中找不到它的含义。

class function TParallel.&For(ALowInclusive, AHighInclusive: Integer; const AIteratorEvent: TProc<Integer>): TLoopResult;

这里的&运算符是什么意思?使用TParallel.&For和TParallel.For是否有区别,因为两者都可以编译。

3
它允许您将保留字定义为标识符,因为没有它就无法使用“For”。 - Jerry Dodge
3
顺便说一句,XE10并不存在。 - David Heffernan
@Victoria:我可能误解了你的评论,但是 with MyAwesomeComputation do End 无法编译。 - Andreas Rejbrand
@David:我知道,但是我认为我的反例表明“调用方法时”&并不完全没有影响。(抱歉我这么挑剔。) - Andreas Rejbrand
@Victoria,“with”可能比“Application.ProcessMessages”更邪恶... - Jerry Dodge
显示剩余4条评论
2个回答

11

& 符号被用于“转义”保留字,考虑下面的例子:

function GetPart: string;
const
  LoremIpsum = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do ' +
    'eiusmod tempor incididunt ut labore et dolore magna aliqua.';
var
  start, end: integer;
begin
  start := 2;
  end := 10;
  result := Copy(LoremIpsum, start, end - start + 1);
end;

显然,这段代码无法编译,因为end是一个保留字,不能作为标识符使用。

但是,如果你还是想要使用end作为变量名,你可以在它的前面加上&

function GetPart: string;
const
  LoremIpsum = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do ' +
    'eiusmod tempor incididunt ut labore et dolore magna aliqua.';
var
  start, &end: integer;
begin
  start := 2;
  &end := 10;
  result := Copy(LoremIpsum, start, &end - start + 1);
end;

这告诉编译器:“嘿,不要将下一个标记视为保留字”。

当然,有人可能会认为,在大多数情况下,最好使用非保留字作为标识符,而不是使用&技巧来转义标记。但是,有时您需要让您的标识符具有由其他框架和技术指定的名称,因此Delphi需要支持一种允许将保留字用作标识符的方法。

(然而,就我个人而言,如果我找到的标识符恰好是保留字,即使没有“外部约束”要求那个名称,我也倾向于在自己的代码中使用&技巧。)


10

这在文档中有描述:

扩展标识符

您可能会遇到与Delphi语言保留字同名的标识符(例如类中的类型或方法)。例如,一个类可能有一个名为begin的方法。 Delphi 保留字如begin不能用作标识符名称。

如果您完全限定了标识符,则没有问题。例如,如果您想使用Delphi保留字"type"作为标识符名称,必须使用其完全限定名称:

var TMyType.type
// Using a fully qualified name avoids ambiguity with {{Delphi}} language keyword.

作为一种更短的选择,可以使用&运算符来解决标识符和Delphi语言保留字之间的歧义。&防止关键字被解析为关键字(即保留字)。如果你遇到了一个与Delphi关键字同名的方法或类型,你可以在标识符名前加上一个&来省略命名空间规范。但是当你声明一个与关键字同名的标识符时,必须使用&:

type
 &Type = Integer;
 // Prefix with '&' is ok.
这段文字解释了为什么在调用该方法时不需要使用&。你可以这样写:
TParallel.For(...);

编译器能够解决歧义,因为你已经对标识符进行了限定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接