1

我在整理以下代码应该做的事情时遇到了很多困难(我理解它应该做什么,我只是无法将这些部分放在一起):

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也是一个数组。

  1. 为什么有同名的 setter 方法和常规方法?
  2. 什么数组作为map方法的对象?如果rolesis['author', 'editor']ROLESis ['author', 'editor', 'manager'],运算符如何为&创建一个数组map
  3. 是什么2**ROLES我发现这真的只是2提升到ROLES.index(r).
  4. Rails 应用程序上的位掩码属性”说这是针对数组(roles & ROLES)清理参数,但清理它是什么意思?rolesROLES
  5. 如果r是数组的当前值,返回的方法(roles & ROLES)如何?我发现这是返回数组中的位置,但我仍然不知道如何与它交互/工作。index2**ROLESrrolesROLES(roles & ROLES).map
  6. 该方法如何在该inject方法的括号中的条件下工作map

我想弄清楚这个位掩码是如何工作的,但我不知道等式右边是如何def roles=(roles)返回一个整数的。

4

1 回答 1

3

基本上,index调用通过确定它们在数组中的位置来将给定的角色转换为整数ROLES。然后将 2 提升到该指数的幂,并inject简单地对结果求和。

简单地说

&第 1 步是通过使用to se 两个数组中的哪些值匹配来获取在 ROLES 中找到的角色。

第 2 步,为每个匹配的角色计算 2**index。Map 返回这些值的数组。

第三步,对数组求和,得到最终的整数。

这个想法是为每个角色组合计算一个唯一的整数。

getter 只是展开返回匹配角色组合的过程。

于 2012-12-16T06:02:57.053 回答