【发布时间】:2020-01-15 03:14:10
【问题描述】:
为了方便以后的搜索,也可以描述为“and equals”或“ampersand equals”。
我在 Rails 源代码中找到了这一行:
attribute_names &= self.class.column_names
&=的作用是什么?
【问题讨论】:
标签: ruby-on-rails ruby operators
为了方便以后的搜索,也可以描述为“and equals”或“ampersand equals”。
我在 Rails 源代码中找到了这一行:
attribute_names &= self.class.column_names
&=的作用是什么?
【问题讨论】:
标签: ruby-on-rails ruby operators
所谓的a &= b 形式的运算符赋值,其中& 可以是另一个二元运算符,是(几乎但不完全是——布尔运算符是notable exception,它们有一些不同的极端情况)相当于a = a & b。
由于 Ruby 中的运算符是在左操作数上调用的方法,并且可以被覆盖,因此了解它们是什么的好方法是查看左操作数(或其祖先之一)的类的文档.
你发现的attribute_names,根据上下文,很可能是ActiveRecord::AttributeMethods#attribute_names,
返回此对象上可用属性的名称数组。
然后我们可以看到Array#&,它执行
SetIntersection — 返回一个新数组,其中包含两个数组共有的唯一元素。顺序从原始数组中保留。它使用
hash和eql?方法比较元素以提高效率。
【讨论】:
一般情况下,它在赋值的左侧和右侧执行&,然后将结果分配给左侧。
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]
【讨论】: