前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >现场访问

现场访问

作者头像
冬夜先生
发布2022-01-05 09:56:00
7670
发布2022-01-05 09:56:00
举报
文章被收录于专栏:csicocsico

字段存取表达用于选择从记录中的值或将投射一个记录或表一个具有更少的字段或列,分别。

字段访问表达式:       字段选择       隐式目标字段选择       投影       隐式目标投影 字段选择:       主表达式字段选择器 字段选择器:       必需字段选择器       可选字段选择器 必需字段-选择器: [ 字段名称 ] 可选字段选择器: [ 字段名称 ] ? 字段名称:       通用标识符       引用标识符 隐式目标字段选择:       字段选择器 投影:       主表达式必需投影       主表达式可选投影 required-projection: [ required-selector-list ] optional-projection: [ required-selector-list ] ? required-selector-list:       required-field-selector       required-selector-list , required-field-selector hidden-target-projection:       required-projection       optional-投影

最简单的字段访问形式是required field selection。它使用运算符x[y]按字段名称在记录中查找字段。如果该字段y在 中不存在x,则会引发错误。该表单x[y]?用于执行可选字段选择,null如果请求的字段在记录中不存在,则返回。

例如:

复制

代码语言:javascript
复制
[A=1,B=2][B]       // 2 
[A=1,B=2][C]       // error 
[A=1,B=2][C]?      // null

运营商支持对多个字段的集体访问,用于必需的记录投影可选的记录投影。操作员x[[y1],[y2],...]将记录投影到具有较少字段的新记录(由y1y2、选择...)。如果所选字段不存在,则会引发错误。操作员x[[y1],[y2],...]将记录投影到具有由y1y2、选择的字段的新记录...;如果缺少字段,null则改为使用。例如:

复制

代码语言:javascript
复制
[A=1,B=2][[B]]           // [B=2] 
[A=1,B=2][[C]]           // error 
[A=1,B=2][[B],[C]]?      // [B=2,C=null]

形式[y][y]?支持作为标识符(下划线)的速记引用_。下面两个表达式是等价的:

复制

代码语言:javascript
复制
[A]                 
_[A]

以下示例说明了字段访问的简写形式:

复制

代码语言:javascript
复制
let _ = [A=1,B=2] in [A] //1

形式[[y1],[y2],...]and[[y1],[y2],...]?也支持作为简写,以下两个表达式同样等效:

复制

代码语言:javascript
复制
[[A],[B]]                 
_[[A],[B]]

速记形式与each速记结合使用特别有用,这是一种引入名为单个参数的函数的方法_(有关详细信息,请参阅简化声明。这两个速记一起简化了常见的高阶函数表达式:

复制

代码语言:javascript
复制
List.Select( {[a=1, b=1], [a=2, b=4]}, each [a] = [b]) 
// {[a=1, b=1]}

上面的表达式等效于以下看起来更神秘的普通文字:

复制

代码语言:javascript
复制
List.Select( {[a=1, b=1], [a=2, b=4]}, (_) => _[a] = _[b]) 
// {[a=1, b=1]}

字段访问不会强制对正在访问的字段以外的字段进行评估。例如:

复制

代码语言:javascript
复制
[A=error "a", B=1, C=error "c"][B]  // 1 
[A=error "a", B=error "b"][B]       // error "b"

当对字段访问运算符x[y], x[y]?, x[[y]], orx[[y]]?求值时,以下内容成立:

  • 在表达式求值过程中出现的错误x被传播。
  • 评估 field 时引发的错误y与 field 永久关联y,然后传播。以后对字段的任何访问y都会引发相同的错误。
  • 该表达式x产生一个记录或表值,或引发错误。
  • 如果标识符y命名的字段在 中不存在x"Expression.Error"则会引发带有原因代码的错误,除非使用可选运算符形式...?,在这种情况下null返回值。

无场x比由名为其他y领域访问的过程中被评估。

元数据运算符

使用元运算符( x meta y)修改值的元数据记录。

元数据表达式:       一元表达式       一元表达式 meta 一元表达式

以下示例使用meta运算符构造带有元数据记录的文本值,然后使用 访问结果值的元数据记录Value.Metadata

复制

代码语言:javascript
复制
Value.Metadata( "Mozart" meta [ Rating = 5 ] ) 
// [Rating = 5 ]
Value.Metadata( "Mozart" meta [ Rating = 5 ] )[Rating] 
// 5

应用元数据组合运算符时,以下内容成立x meta y

  • 传播计算xory表达式时引发的错误。
  • y表达式必须是一个记录,或者用原因代码的误差"Expression.Error"上升。
  • 生成的元数据记录是x与 合并的元数据记录y。(有关记录合并的语义,请参阅记录合并。)
  • 结果值是x表达式中的值,不带元数据,附加新计算的元数据记录。

标准库函数Value.RemoveMetadataValue.ReplaceMetadata可用于从一个值中删除所有元数据和替换值的元数据(而不是合并入元数据可能存在的元数据)。以下表达式是等效的:

复制

代码语言:javascript
复制
x meta y  
Value.ReplaceMetadata(x, Value.Metadata(x) & y) 
Value.RemoveMetadata(x) meta (Value.Metadata(x) & y)

等号运算符

相等运算 =被用于确定如果两个值是相等的。该不等式操作者 <>用于确定如果两个值不相等。

等式表达式:       关系表达式       关系表达式 = 等式表达式       关系表达式 <> 等式表达式

例如:

复制

代码语言:javascript
复制
1 = 1            // true 
1 = 2            // false 
1 <> 1           // false 
1 <> 2           // true 
null = true      // false 
null = null      // true

元数据不是平等或不平等比较的一部分。例如:

复制

代码语言:javascript
复制
(1 meta [ a = 1 ]) = (1 meta [ a = 2 ]) // true 
(1 meta [ a = 1 ]) = 1                  // true

应用等式运算符x = yand时,以下内容成立x <> y

  • 传播计算xory表达式时引发的错误。
  • = 运营商具有的结果true,如果这两个值相等,并false以其他方式。
  • <>运营商具有的结果false,如果这两个值相等,并true以其他方式。
  • 元数据记录不包括在比较中。
  • 如果通过对xy表达式求值而产生的值不是同一种值,则这些值不相等。
  • 如果通过对xy表达式求值所产生的值是同一种值,则有特定的规则来确定它们是否相等,如下所定义。
  • 以下始终是正确的:

复制

代码语言:javascript
复制
    (x = y) = not (x <> y)

为以下类型定义了相等运算符:

  • null值仅等于自身。

复制

代码语言:javascript
复制
    null = null    // true 
    null = true    // false 
    null = false   // false
  • 逻辑值truefalse只等于它们自己。例如:

复制

代码语言:javascript
复制
    true = true      // true 
    false = false    // true 
    true = false     // false 
    true = 1         // false
  • 使用指定的精度比较数字:
    • 如果任一数字为#nan,则数字不相同。
    • 当两个数字都不是 时#nan,则使用数值的按位比较来比较这些数字。
    • #nan 是唯一不等于自身的值。 例如:

复制

代码语言:javascript
复制
        1 = 1,              // true 
        1.0 = 1             // true 
        2 = 1               // false 
        #nan = #nan         // false 
        #nan <> #nan        // true
  • 如果两个持续时间代表相同数量的 100 纳秒刻度,则它们是相等的。
  • 如果两个部分(时、分、秒)的大小相等,则两个时间相等。
  • 如果两个日期的部分(年、月、日)的大小相等,则两个日期相等。
  • 如果两个日期时间的分量(年、月、日、时、分、秒)相等,则它们相等。
  • 如果相应的 UTC 日期时间相等,则两个日期时区相等。要获得相应的 UTC 日期时间,需要从日期时区的日期时间分量中减去小时/分钟偏移量。
  • 如果使用有序、区分大小写、不区分区域性的比较,则两个文本值相等,它们在相应位置具有相同的长度和相等的字符。
  • 如果以下所有条件都为真,则两个列表值相等:
    • 两个列表包含相同数量的项目。
    • 列表中每个位置对应项的值相等。这意味着列表不仅需要包含相等的项目,而且这些项目需要具有相同的顺序。 例如:

复制

代码语言:javascript
复制
        {1, 2} = {1, 2}     // true 
        {2, 1} = {1, 2}     // false 
        {1, 2, 3} = {1, 2}  // false
  • 如果以下所有条件都为真,则两条记录相等:
    • 字段数相同。
    • 一条记录的每个字段名称也存在于另一条记录中。
    • 一条记录的每个字段的值等于另一条记录中同名字段的值。 例如:

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 元数据运算符
  • 等号运算符
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档