JSRUN 用代码说话

数组

编辑教程

数组

一个数组是一种简单的固定长度的容器。数组中的每个元素具有相同的类型。数组的索引类型可以是任何序数类型。

数组可以通过[]构造:

type
  IntArray = array[0..5, int] # an array that is indexed with 0..5
var
  x: IntArray
x = [1, 2, 3, 4, 5, 6]
for i in low(x)..high(x):
  echo(x[i])

标记x[i]是用来访问x的第i个元素。数组访问总是进行边界检查(在编译或者运行时)。这些检查可以禁用通过编译或调用编译器的命令行开关——bound_checks:off command line switch

数组是值类型,像其他nim类型,赋值操作将复制整个数组内容。

内置的len过程返回数组的长度。low(a)返回数组最小有效下标,high(a)返回数组最大有效下标。

type
  Direction = enum
    north, east, south, west
  BlinkLights = enum
    off, on, slowBlink, mediumBlink, fastBlink
  LevelSetting = array[north..west, BlinkLights]
var
  level: LevelSetting
level[north] = on
level[south] = slowBlink
level[east] = fastBlink
echo repr(level)  # --> [on, fastBlink, slowBlink, off]
echo low(level)   # --> north
echo len(level)   # --> 4
echo high(level)  # --> west

嵌套的数组语法在其他语言中是附加更多的括号,因为通常每个维度与其他限制相同的索引类型。在nim中你可以有不同的维度带有不同的索引类型,所以嵌套语法有些不一样。在前面的例子中,一个level被定义为一个数组枚举索引通过另一个枚举类型。我们可以添加以下的代码增加一个light tower类型在高度细分通过访问它们的整形索引:

type
  LightTower = array[1..10, LevelSetting]
var
  tower: LightTower
tower[1][north] = slowBlink
tower[1][east] = mediumBlink
echo len(tower)     # --> 10
echo len(tower[1])  # --> 4
echo repr(tower)    # --> [[slowBlink, mediumBlink, ...more output..
# The following lines don't compile due to type mismatch errors
#tower[north][east] = on
#tower[0][1] = on

注意:内置的built-in过程仅仅只返回数组的第一维的长度。另一种方式定义LightTower表现出更好的嵌套性质,将省略前面的LevelSetting类型的定义,相反将它直接嵌入作为第一维度的类型:

type
  LightTower = array[1..10, array[north..west, BlinkLights]]

这是相当常见的数组从0开始,所以这是一个快捷的语法,指定一个范围从0到指定的下标值减一:

type
  IntArray = array[0..5, int] # an array that is indexed with 0..5
  QuickArray = array[6, int]  # an array that is indexed with 0..5
var
  x: IntArray
  y: QuickArray
x = [1, 2, 3, 4, 5, 6]
y = x
for i in low(x)..high(x):
  echo(x[i], y[i])

开放数组

  • Openarrays只能用于参数。

  • 通常固定大小的数组被证明会过于呆板;过程应该能够处理不同大小的数组。openarray类型允许这样。Openarray总是有一个int型索引从位置0开始。len,low,high操作同样适用于open arrays。任何带有兼容基类型的数组都可以被传递到一个openarray参数,索引类型并不重要。

  • openarray类型不能被嵌套:多维的openarray不被支持因为这很少用到以及它不能有效的进行。
JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。 大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
支付宝
9.99
无法付款,请点击这里
金额: 0
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟