Rails——&= 是做什么的?

Rails—what does &= do?

为了方便以后的搜索,也可以描述为"and equals"或"ampersand equals"。

我在 Rails 源代码中找到了这一行:

attribute_names &= self.class.column_names

&=的作用是什么?

一般情况下,对左右两边进行&赋值,然后将结果赋给左边

11 & 10
# => 10
a = 11
a &= 10
a
=> 10

a = true
a &= false
a
#=> false

在您的例子中,它执行数组交集(& 运算符),然后将结果分配给 attribute names:

[1,2,3] & [2,3,4]
# => [2, 3]
a &= [2,3,4]
a
#=> [2, 3]

形式为 a &= b 的所谓运算符赋值,其中 & 可以是另一个二元运算符,是(几乎但不完全是 - 布尔运算符是 notable exception有一些不同的极端情况)相当于 a = a & b.

由于 Ruby 中的运算符是在左操作数上调用的方法,并且可以被覆盖,了解它们是什么的一个好方法是查看 class 的文档左操作数(或它们的祖先之一)。

attribute_names 你发现,给定上下文,很可能 ActiveRecord::AttributeMethods#attribute_names

Returns an array of names for the attributes available on this object.

然后我们可以看到Array#&,它执行

Set Intersection — Returns a new array containing unique elements common to the two arrays. The order is preserved from the original array.

It compares elements using their hash and eql? methods for efficiency.