语言问题:以匿名记录(?)作为类型的记录字段...?
Language question: record field with an anonymous record(?) as type...?
我仍在学习 Delphi/OP 并且偶然发现了下面的(简化的)代码,它是旧 Delphi 书中练习的一部分。
type
TMyRec = record
FField1: Integer;
FField2: String;
FAnonRec: record
FAnonField: Integer;
end;
FField3: Boolean;
end;
我的主要问题是:
1. FAnonRec
- 或者更确切地说,它的类型 - 在语言术语中被称为什么?我如何引用它?类似于 匿名记录类型的记录字段 ...?只是 构造类型 ...? - 我用谷歌搜索了我的问题一段时间,但一直在获取有关古希腊历史的结果...我找到的最接近的是 this error explanation.
更多问题:
2. 一般来说,这种类型的构造称为什么("creating the type" 就在那时,而不是使用预先声明的命名类型)? - 无论它是在示例中使用还是在 var
块中使用,或者即使没有使用记录。
3、Delphi中的"Structure"工具只显示FField1
和FField2
:
- 然而 "Class Explorer" 工具显示了整个记录:
- 有人知道为什么吗?
4. 第 3 点以及这是一本旧书的事实以及我很难找到更多关于它的信息这一事实让我想知道这种结构是否可能 outdated/discouraged?
我会称之为 "nested record type definition"。它从 Turbo Pascal IIRC 开始就存在,与最近(至少在本世纪)引入的 "anonymous methods" 无关,后者是一个更复杂的野兽,因为它抓住了一些执行上下文。
我看不出有任何理由认为它已过时或令人气馁。这是一个完美的有效结构,从代码的角度来看是有意义的,因为它在逻辑父字段中收集了一些字段。当然,如果您希望独立访问它,那么专门的类型定义是值得的。性能是一样的,只是YAGNI会更方便(打字少,记录一目了然)。
因此您可以从编写此类嵌套记录开始,然后在需要时定义专用类型 - 例如如果添加一些方法可以使您的代码更具可读性和可维护性。实际上,在类型定义中使用嵌套记录可以减少代码库中的最终代码更改,因为稍后添加显式类型定义不会破坏从现有代码访问其成员的方式。
请注意,它有 RTTI,作为一个独立的记录,以 "main" 记录命名(类似于 '__TMyRec_FAnonRec'
)。所以从 RTTI 的角度来看,它不是匿名的。 ;)
我仍在学习 Delphi/OP 并且偶然发现了下面的(简化的)代码,它是旧 Delphi 书中练习的一部分。
type
TMyRec = record
FField1: Integer;
FField2: String;
FAnonRec: record
FAnonField: Integer;
end;
FField3: Boolean;
end;
我的主要问题是:
1. FAnonRec
- 或者更确切地说,它的类型 - 在语言术语中被称为什么?我如何引用它?类似于 匿名记录类型的记录字段 ...?只是 构造类型 ...? - 我用谷歌搜索了我的问题一段时间,但一直在获取有关古希腊历史的结果...我找到的最接近的是 this error explanation.
更多问题:
2. 一般来说,这种类型的构造称为什么("creating the type" 就在那时,而不是使用预先声明的命名类型)? - 无论它是在示例中使用还是在 var
块中使用,或者即使没有使用记录。
3、Delphi中的"Structure"工具只显示FField1
和FField2
:
- 然而 "Class Explorer" 工具显示了整个记录:
- 有人知道为什么吗?
4. 第 3 点以及这是一本旧书的事实以及我很难找到更多关于它的信息这一事实让我想知道这种结构是否可能 outdated/discouraged?
我会称之为 "nested record type definition"。它从 Turbo Pascal IIRC 开始就存在,与最近(至少在本世纪)引入的 "anonymous methods" 无关,后者是一个更复杂的野兽,因为它抓住了一些执行上下文。
我看不出有任何理由认为它已过时或令人气馁。这是一个完美的有效结构,从代码的角度来看是有意义的,因为它在逻辑父字段中收集了一些字段。当然,如果您希望独立访问它,那么专门的类型定义是值得的。性能是一样的,只是YAGNI会更方便(打字少,记录一目了然)。
因此您可以从编写此类嵌套记录开始,然后在需要时定义专用类型 - 例如如果添加一些方法可以使您的代码更具可读性和可维护性。实际上,在类型定义中使用嵌套记录可以减少代码库中的最终代码更改,因为稍后添加显式类型定义不会破坏从现有代码访问其成员的方式。
请注意,它有 RTTI,作为一个独立的记录,以 "main" 记录命名(类似于 '__TMyRec_FAnonRec'
)。所以从 RTTI 的角度来看,它不是匿名的。 ;)