我在整理以下代码应该做的事情时遇到了很多困难(我理解它应该做什么,我只是无法将这些部分放在一起):
def roles=(roles)
self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
end
def roles
ROLES.reject do |r|
((roles_mask || 0) & 2**ROLES.index(r)).zero?
end
end
ROLES
是链接中指定的数组。我假设roles
也是一个数组。
- 为什么有同名的 setter 方法和常规方法?
- 什么数组作为
map
方法的对象?如果roles
is['author', 'editor']
和ROLES
is['author', 'editor', 'manager']
,运算符如何为&
创建一个数组map
? - 是什么
2**ROLES
?我发现这真的只是2
提升到ROLES.index(r)
. - “ Rails 应用程序上的位掩码属性”说这是针对数组
(roles & ROLES)
清理参数,但清理它是什么意思?roles
ROLES
- 如果
r
是数组的当前值,返回的方法(roles & ROLES)
如何?我发现这是返回数组中的位置,但我仍然不知道如何与它交互/工作。index
2**ROLES
r
roles
ROLES
(roles & ROLES).map
- 该方法如何在该
inject
方法的括号中的条件下工作map
?
我想弄清楚这个位掩码是如何工作的,但我不知道等式右边是如何def roles=(roles)
返回一个整数的。