索引表达式
语法
| 形式 | 语法 |
|---|---|
| 1 | 表达式 [ <? 表达式 ] |
| 2 | 表达式 [ <? 表达式 .. <? 表达式 ] |
| 3 | 表达式 . 标识符 |
描述
索引表达式用于从 array、map、buffer 或 class_map 类型的值中获取元素,或者访问定义在其他脚本中的常量。
如上所示,形式3 的索引表达式是形式1 的语法糖,其等价于:
- 表达式 [ "标识 符" ]
在 [ ] 之间的表达式被称为 索引,如形式2 所示,可以使用 .. 和两个索引来表示一个索引范围内(包含两端)
的切片。
索引前可以跟随一个可选的 <,用于指示逆序索引:
array a = [10, 20, 30, 40, 50];
writeln(a[4]); // 50
writeln(a[<1]); // 也是50
索引规则
从不同类型的表达式进行索引操作时,索引 类型和结果类型都各不相同:
| 被索引类型 | 索引类型 | 结果类型 | 说明 |
|---|---|---|---|
array | int | mixed(如果是范围索引:array) | 获取数组的元素/切片,索引越界将抛出异常。可以使用范围索引和逆序索引 |
map | mixed | mixed | 用于获取指定键在 map 中的值,如果指定的索引不存在,得到 nil。不能使用范围索引和逆序索引 |
class_map | string | 对应的字段类型 | 用于获取 class_map 实例的成员值,如果指定的索引不存在,得到 nil。不能使用范围索引和逆序索引 |
buffer | int | int (如果是范围索引:buffer) | 用于获取 buffer 指定位置的字节值(或切片),索引越界将抛出异常。可以使用范围索引和逆序索引 |
string | int | int (如果是范围索引:string) | 用于获取字符串指定位置的字符(或切片),索引越界将抛出异常。可以使用范围索引和逆序索引 |
string 字面量(应当是一个路径,指向某个 GS 脚本) | string 字面量 | 对应的常量类型 | 从指定的脚本中获取常量值,该索引在编译期完成,如果常量不存在(或者指定的脚本不存在),抛出编译期错误 |
示例
array a = [10, 20, 30, 40, 50];
writeln(a[4]); // 50
writeln(a[<1]); // 也是50
writeln(a[1..3]); // [20, 30, 40]
map m = { "a": 10, "b": 20 };
writeln(m["a"]); // 10