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