我在整理以下代码应该做的事情时遇到了很多困难(我理解它应该做什么,我只是无法将这些部分放在一起):
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方法的对象?如果rolesis['author', 'editor']和ROLESis['author', 'editor', 'manager'],运算符如何为&创建一个数组map? - 是什么
2**ROLES?我发现这真的只是2提升到ROLES.index(r). - “ Rails 应用程序上的位掩码属性”说这是针对数组
(roles & ROLES)清理参数,但清理它是什么意思?rolesROLES - 如果
r是数组的当前值,返回的方法(roles & ROLES)如何?我发现这是返回数组中的位置,但我仍然不知道如何与它交互/工作。index2**ROLESrrolesROLES(roles & ROLES).map - 该方法如何在该
inject方法的括号中的条件下工作map?
我想弄清楚这个位掩码是如何工作的,但我不知道等式右边是如何def roles=(roles)返回一个整数的。