为什么会这样?
words = ['molly', 'fish', 'sally']
cats = ['sally', 'molly']
matches = words & cats
我的研究表明&符号是一个按位运算符。为什么会产生这种影响?
答案 0 :(得分:2)
类Array
上定义了一个名为:&
的方法:
[] class.method_defined。?(:安培)
=>真
这会调用基础C代码:
static VALUE
rb_ary_and(VALUE ary1, VALUE ary2)
{
VALUE hash, ary3, v;
st_table *table;
st_data_t vv;
long i;
ary2 = to_ary(ary2);
ary3 = rb_ary_new();
if (RARRAY_LEN(ary2) == 0) return ary3;
hash = ary_make_hash(ary2);
table = rb_hash_tbl_raw(hash);
for (i=0; i<RARRAY_LEN(ary1); i++) {
v = RARRAY_AREF(ary1, i);
vv = (st_data_t)v;
if (st_delete(table, &vv, 0)) {
rb_ary_push(ary3, v);
}
}
ary_recycle_hash(hash);
return ary3;
}
这将检查两个阵列中的所有共享值。
答案 1 :(得分:1)
根据Array Ruby docs; #&
是两个数组之间的交集。
返回一个新数组,其中包含两个数组共有的元素,不包括任何重复项。订单将从原始数组中保留。
它使用hash和eql来比较元素?提高效率的方法。
答案 2 :(得分:0)
&
是一个返回交集的数组函数。
http://www.ruby-doc.org/core-2.1.3/Array.html#method-i-26
ary & other_ary → new_ary
Set Intersection — Returns a new array containing elements common to the two arrays, excluding any duplicates. The order is preserved from the original array.
It compares elements using their hash and eql? methods for efficiency.
[ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ]
[ 'a', 'b', 'b', 'z' ] & [ 'a', 'b', 'c' ] #=> [ 'a', 'b' ]
See also #uniq.