为什么这种形式的文字具有似乎取决于上下文的含义?

戴维·赫弗南

考虑以下程序:

{$APPTYPE CONSOLE}

type
  TMyEnum = (enum1, enum2, enum3);

var
  Arr: TArray<TMyEnum>;
  Enum: TMyEnum;

begin
  Arr := [enum3, enum1]; // <-- this is an array
  for Enum in Arr do
    Writeln(ord(Enum));
  Writeln('---');

  for Enum in [enum3, enum1] do // <-- this looks very much like the array above
    Writeln(ord(Enum));
  Writeln('---');

  Readln;
end.

输出为:

2 
0 
--- 
0 
2 
---

为什么两个回路产生不同的输出?

戴维·赫弗南
for Enum in Arr do
  Writeln(ord(Enum));

在这里,Arr是一个数组,因此该数组的项按顺序输出。文件说:

数组以递增顺序遍历。

因此2,输出为before 0

for Enum in [enum3, enum1] do
  Writeln(ord(Enum));

在这里,[enum3, enum1]是一个集合,并且集合的枚举数正好按顺序值的递增顺序枚举。因此输出0优先。

我认为在文档中没有按顺序列出集合的说明,但从经验上看似乎是这种情况。但是,由于集合是无序类型,因此无论如何都不应依赖于其枚举顺序。


因此,问题就变成了[...]在代码的不同点如何理解集合或数组。这一切都源于新的XE7动态数组语法,它引入了(另一种)句法歧义。当我们写

Arr := [enum3, enum1];

然后[enum3, enum1]是一个数组。编译器知道这Arr是一个数组,并且该信息定义了文字的类型。

但是当我们写

for Enum in [enum3, enum1] do

然后[enum3, enum1]是一组。在这里,字面量原则上可以是数组或集合。在这种情况下,我相信编译器将始终喜欢使用集合。

再次,我找不到任何文档说明这种情况,但是从经验上讲,是这种情况。据推测,由于集合枚举器早于新的动态数组语法,因此在存在歧义时,它们优先。

形式文字的含义[...]取决于其上下文。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么静态取决于上下文有不同的含义?

为什么模板别名专门化取决于引用它的上下文?

Liquibase loadData取决于上下文

HTML对空格字符的处理取决于上下文-但是规则是什么?

C ++使变量的类型取决于上下文吗?

Eclipse Scout表菜单取决于表上下文

Odoo 9 - 动态选择字段取决于上下文

为什么在F的上下文中Deferred工厂方法具有返回值

为什么perf具有如此高的上下文切换?

为什么对象实例中的枚举具有静态上下文?

为什么特征不能具有上下文边界参数

为什么具有域上下文的 FindByIdentity 忽略参数中的本地机器名称?

AIML-上下文-为什么上下文在所有情况下都不具有最高优先级?

Akka 流 - 为什么没有删除上下文?

没有正确的上下文......为什么?

为什么我的数组没有上下文?

Javascript:为什么具有全局执行上下文的回调函数可以访问作用域变量?

具有上下文的react-router-为什么它与锚vs链接不一样

为什么Catalyst中具有多个PSGI应用程序的授权上下文不起作用?

如果未在更新时指定所有上下文,为什么会执行所有上下文?

为什么意图需要上下文?

为什么上下文=无?

Django模板似乎没有得到我的上下文字典

iptables:具有规则的上下文

具有上下文的全局功能

上下文评估有什么功能

取决于上下文的ANTLR4语义谓词不起作用

懒惰可能还意味着函数的值取决于调用它的上下文吗?

上下文菜单中的不同链接取决于单击的 ImageView