在eiffel中,索引通常从1开始,而不是从0开始。
我有以下两个属性:
arr: ARRAY[A]
link: LINKED_LIST[B]
对于数组,我可以使其索引从0开始,如下所示:
arr.force (value, arr.count)
以便arr [0]可读。
但是,我对LINKED_LIST做了类似的事情:
link.put_i_th (value, link.count)
然而,这会违反先决条件。
有没有办法让LINKED_LIST从0开始索引,而不是1?以便链接[0]可以访问?
如果可能,我需要一个例子。
答案 0 :(得分:2)
使用函数valid_key
指定put_i_th
中LINKED_LIST
的前提条件LIST
(以及更一般的valid_index
)。后者的行为可以从其后置条件Result = (i >= 1 and i <= count)
导出。它声明有效索引大于零。
容器的边界也可用作查询lower
和upper
。对于LIST
,lower
的值是常量1
。
从上面的观察结果可以看出,LIST
(和LINKED_LIST
)不能在索引0
(或以下)处拥有元素。
此外,与直接控制结构大小的ARRAY
不同,LIST
的元素是逐个添加的。这就是为什么force
中的LIST
没有索引,并且像extend
那样在结构的末尾添加新元素。
虽然ARRAY
允许从0
(或任何其他整数值)建立索引,但使用1
以外的较低索引被认为是一种不好的做法,因为大多数容器都有lower = 1
}。只有在极少数情况下代码可以从不同于1
的索引开始受益时,才有可能偏离标准约定。