记录

2022-01-05 09:54:17 浏览数 (2)

一个记录值是字段的有序序列。甲字段由一个的字段名,这是一个文本值唯一地标识记录内的字段,以及字段值。字段值可以是任何类型的值,包括记录。可以使用初始化语法构造记录,如下所示:

记录表达式: [ 字段列表选择 ] 字段列表:       字段       字段 , 字段列表 字段:       字段名称 = 表达式 字段名称:       通用标识符       引用标识符

下面的示例构造一个记录,其字段以xvalue1命名y,字段以value命名2

复制

代码语言:javascript复制
[ x = 1, y = 2 ]

下面的示例构造一个带有a名为 a 的字段和嵌套记录值的记录。嵌套记录有一个名为bvalue的字段2

复制

代码语言:javascript复制
[ a = [ b = 2 ] ]

在评估记录表达式时,以下内容成立:

  • 分配给每个字段名称的表达式用于确定关联字段的值。
  • 如果分配给字段名称的表达式在计算时产生一个值,则该值将成为结果记录的字段的值。
  • 如果分配给字段名称的表达式在评估时引发错误,则引发错误的事实与该字段以及引发的错误值一起记录。对该字段的后续访问将导致使用记录的错误值重新引发错误。
  • 该表达式在类似于父环境的环境中进行评估,仅合并了与记录的每个字段的值相对应的变量,除了被初始化的字段。
  • 在访问相应字段之前,不会评估记录中的值。
  • 记录中的值最多被评估一次。
  • 表达式的结果是一个带有空元数据记录的记录值。
  • 记录中字段的顺序由它们在record-initializer-expression 中出现的顺序定义。
  • 指定的每个字段名称在记录中都必须是唯一的,否则会出错。名称使用顺序比较进行比较。

复制

代码语言:javascript复制
    [ x = 1, x = 2 ] // error: field names must be unique 
    [ X = 1, x = 2 ] // OK

没有字段的记录称为空记录,其写法如下:

复制

代码语言:javascript复制
[] // empty record

虽然在访问一个字段或比较两个记录时,记录字段的顺序并不重要,但在其他上下文中很重要,例如在枚举记录的字段时。

相同的两条记录在获取字段时会产生不同的结果:

复制

代码语言:javascript复制
Record.FieldNames([ x = 1, y = 2 ]) // [ "x", "y" ] 
Record.FieldNames([ y = 1, x = 2 ]) // [ "y", "x" ]

可以使用该Record.FieldCount函数确定记录中的字段数。例如:

复制

代码语言:javascript复制
Record.FieldCount([ x = 1, y = 2 })  // 2 
Record.FieldCount([])                // 0

除了使用记录初始化语法[ ],记录还可以由值列表、字段名称列表或记录类型构成。例如:

复制

代码语言:javascript复制
Record.FromList({1, 2}, {"a", "b"})

以上等价于:

复制

代码语言:javascript复制
[ a = 1, b = 2 ]

为记录值定义了以下运算符:

操作员

结果

x = y

平等的

x <> y

不相等

x & y

合并

x ?? y

合并

以下示例说明了上述运算符。请注意,如果字段名称重叠,记录合并使用来自右侧操作数的字段来覆盖来自左侧操作数的字段。

复制

代码语言:javascript复制
[ a = 1, b = 2 ] & [ c = 3 ]    // [ a = 1, b = 2, c = 3 ] 
[ a = 1, b = 2 ] & [ a = 3 ]    // [ a = 3, b = 2 ] 
[ a = 1, b = 2 ] = [ b = 2, a = 1 ]         // true 
[ a = 1, b = 2, c = 3 ] <> [ a = 1, b = 2 ] // true

记录值的本机类型是内在类型record,它指定一个开放的空字段列表。

桌子

表值是行的有序序列。一是值的有序序列。表的类型决定了表中所有行的长度、表列的名称、表列的类型以及表键的结构(如果有)。

表没有文字语法。提供了几个标准库函数来构造二进制值。例如,#table可用于从行列表列表和标题名称列表构造表:

复制

代码语言:javascript复制
#table({"x", "x^2"}, {{1,1}, {2,4}, {3,9}})

上面的例子构造了一个包含两列的表,两列都是type any

#table 也可用于指定全表类型:

复制

代码语言:javascript复制
#table(
    type table [Digit = number, Name = text],  
    {{1,"one"}, {2,"two"}, {3,"three"}} 
    )

此处新表值具有指定列名和列类型的表类型。

为表值定义了以下运算符:

操作员

结果

x = y

平等的

x <> y

不相等

x & y

级联

x ?? y

合并

表串联对齐同名列并填充null仅出现在操作数表之一中的列。以下示例说明了表串联:

复制

代码语言:javascript复制
  #table({"A","B"}, {{1,2}}) 
& #table({"B","C"}, {{3,4}})

一个

C

1

2

null

null

3

4

表值的本机类型是自定义表类型(派生自内部类型table),它列出列名称,将所有列类型指定为 any,并且没有键。(有关表类型的详细信息,请参阅表类型。)

0 人点赞