forked from OnRoadZy/RacketGuideInChinese
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path05.7 预制结构类型
62 lines (39 loc) · 3.6 KB
/
05.7 预制结构类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
5.7 预制结构类型
虽然transparent结构类型以显示内容的方式打印,但结构的打印形式不能用于表达式中以获得结构,不像数字、字符串、符号或列表的打印形式。
预制(prefab)(“被预先制造”)结构类型是内置的类型,是已知的Racket打印机和表达式阅读器。有无限多这样的类型存在,他们索引是通过名字、字段计数、超类型以及其它细节。一个预制结构的打印形式类似于一个矢量,但它以#s开始而不是以#开始,而且打印表的第一个元素是预制结构类型的名称。
下面的示例显示具有一个字段的sprout预置结构类型的实例。第一个实例具有字段值'bean,第二个实例具有字段值'alfalfa:
> '#s(sprout bean)
'#s(sprout bean)
> '#s(sprout alfalfa)
'#s(sprout alfalfa)
像数字和字符串一样,预置结构是“自引用”,所以上面的引号是可选的:
> #s(sprout bean)
'#s(sprout bean)
当你随struct使用#:prefab关键字,而不是生成一个新的结构类型,你获得与现有的预制结构类型的绑定操作:
> (define lunch '#s(sprout bean))
> (struct sprout (kind) #:prefab)
> (sprout? lunch)
#t
> (sprout-kind lunch)
'bean
> (sprout 'garlic)
'#s(sprout garlic)
上面的字段名称kind对查找预置结构类型无关紧要,仅名称sprout和字段的数量是紧要的。同时,具有三个字段的预制结构类型sprout是一种不同于单个字段的结构类型:
> (sprout? #s(sprout bean #f 17))
#f
> (struct sprout (kind yummy? count) #:prefab) ;重定义
> (sprout? #s(sprout bean #f 17))
#t
> (sprout? lunch)
#f
预制结构类型可以有另一种预制结构类型作为它的超类型,它具有可变的字段,并可以有自动字段。这些维度中的任何变化都对应于不同的预置结构类型,结构类型的名称的打印形式编码所有相关的细节。
> (struct building (rooms [location #:mutable]) #:prefab)
> (struct house building ([occupied #:auto]) #:prefab
#:auto-value 'no)
> (house 5 'factory)
'#s((house (1 no) building 2 #(1)) 5 factory no)
每个预制结构类型都是透明的,但甚至比透明类型更抽象,因为可以创建实例而不必访问特定的结构类型声明或现有示例。总体而言,结构类型的不同选项提供了更抽象到更方便的各种可能性:
1、不透明的(Opaque)(默认):没有访问结构类型声明,就不能检查或创造实例。正如下一节所讨论的,构造函数和属性可以附加到结构类型上,以进一步保护或专门化其实例的行为。
2、透明的(Transparent):任何人都可以检查或创建一个没有访问结构类型声明的实例,这意味着值打印机可以显示实例的内容。然而,所有实例创建都通过一个构造函数守护程序,这样可以控制实例的内容,并且实例的行为可以通过属性进行专门化。由于结构类型是由其定义生成的,所以实例不能简单地通过结构类型的名称来生成,因此不能由表达式读取器自动生成。
3、预制(Prefab):任何人都可以在任何时候检查或创建实例,而不必事先访问结构类型声明或实例。因此,表达式读取器可以直接生成实例。实例不能具有构造函数守护程序或属性。
由于表达式读取器可以生成预制实例,所以在方便序列化比抽象更重要时它们是有用的。然而,不透明和透明的结构也可以被序列化,如果他们被serializable-struct定义,其描述见《数据类型和序列化》(Datatypes and Serialization.)。