ObjectRange
排列(Range)描述了遵循某种规则变化的一系列的值。值必须是可推导的,更确切地说,需要实现一个 succ
方法让我们能够从一个值步进到下一个值(它的 后继者)。
译注:对于这里的 Range,大多数翻译为“范围”,但我觉得它的表现更类似于数学中的“数列”,
因为这里明显不限于数值,故译为“排列”。
Prototype 为 Number
和 String
提供了相应的 succ
方法。对于自定义对象,
如果要启用排列,你必须实现符合相应语义的 succ
方法。
ObjectRange
混入了 Enumerable,从而使得排列具有多方面的用途。
然而,需要注意的是,为获得更好的性能,通常需要重写 include 方法。
虽然 ObjectRange
提供了一个构造器,但获取排列的方法还是应该优先使用 $R
工具函数。两者是完全等同的(只是后者更为简捷)。
样例
毋庸置疑,数值的排列是最为常见的:
$A($R(1, 5)).join(', ')
// -> '1, 2, 3, 4, 5'
$R(1, 5).zip(
['one', 'two', 'three', 'four', 'five'],
function(tuple) {
return tuple.join(' = ');
}
)
// -> ['1 = one', '2 = two', '3 = three', '4 = four', '5 = five']
注意基于 String
的排列:在 String
的 succ
方法中已有描述,它的范围并不仅限于英语字母表,而是与当前浏览器的字符集一致:
$A($R('a', 'e'))
// -> ['a', 'b', 'c', 'd', 'e'],这一点都不奇怪
$A($R('ax', 'ba'))
// -> 噢!非常大的数组,开始部分是 ['ax', 'ay', 'az', 'a{', 'a|', 'a}', 'a~'...]
方法
include
include(value) -> Boolean
判断排列中是否包含指定的值。