ObjectRange.include - Prototype JavaScript 框架

Xunxin Prototype API

include

include(value) -> Boolean

判断排列中是否包含指定的值。

这个方法的默认实现假定排列中的值具有严格有效的弱序化规则(即操作符 < 在任意两个值之间都有明确的语义)。尽管 ObjectRange 混入了 Enumerable,但是这里仍然重写了 Enumerable 中默认的 include 方法,以使它具有更好的性能 (它简单的比较 value 是否在 ObjectRange 的上下限值之内)。

译注:正如上面的描述,这个方法只是简单的比较 value 是否在 ObjectRange 的上下限值之内。所以,如果要在自定义对象上实现自己的排列,很多时候都必须重写 include 方法,另外, 在对 ObjectRange 进行遍历时,也是调用 include 方法确定当前的值是否仍在排列中。
下面给出一个简单的例子以说明这个问题:

var Sequence = Class.create({
	initialize: function(original){
		this.original = original;
	},
	// 实现自定义对象的 succ 方法
	succ: function(){
		// 注意:必须返回自定义的对象类型
		return new Sequence(this.original + 2);
	},
	// 如果 toString 返回一个常量,同时又未实现自己的 include 方法
	// 那么 $R(new Sequence(1), new Sequence(10)) 将会成为一个死循环
	toString: function(){
		return this.original;
	}
});
		
var result = [];
var range = $R(new Sequence(1), new Sequence(10));
range.each(function(s){
	result.push(s.toString());
});
result.join(' ');
// -> '1 3 5 7 9'

range.include(new Sequence(4));
// -> true。明显是错误的。

显然,最后的结果不符合我们的意图,这是因为未实现自己的 include 方法,所以只是简单的根据 toString 方法返回的值来进行比较以确定元素是否在当前排列中。

样例

$R(1, 10).include(5) // -> true 
$R('a', 'h').include('x') // -> false 
$R(1, 10).include(10) // -> true 
$R(1, 10, true).include(10) // -> false