Ruby语法:位掩码

Ruby语法:位掩码,ruby,syntax,Ruby,Syntax,我很难把它应该做的事情组合起来(我知道它应该做什么,我就是不能把它们组合起来): 角色是链接中指定的数组。我假设角色也是一个数组 为什么setter方法和常规方法具有相同的名称 什么数组用作map方法的对象?如果角色是['author','editor']而角色是['author','editor','manager'],那么&操作符如何为映射创建数组 什么是2**角色?我发现这实际上只是2提升到角色的力量。索引(r) “”表示,(角色和角色)正在针对数组角色清理参数角色,但清理意味着什么 如果

我很难把它应该做的事情组合起来(我知道它应该做什么,我就是不能把它们组合起来):

角色
是链接中指定的数组。我假设
角色
也是一个数组

  • 为什么setter方法和常规方法具有相同的名称
  • 什么数组用作
    map
    方法的对象?如果
    角色
    ['author','editor']
    角色
    ['author','editor','manager']
    ,那么
    &
    操作符如何为
    映射创建数组
  • 什么是
    2**角色
    ?我发现这实际上只是
    2
    提升到
    角色的力量。索引(r)
  • “”表示,
    (角色和角色)
    正在针对数组
    角色
    清理参数
    角色
    ,但清理意味着什么
  • 如果
    r
    是数组
    (角色和角色)
    的当前值,
    2**roles
    索引方法如何返回
    r
    ?我发现这是返回
    角色
    在数组
    角色
    中的位置,但我仍然不知道
    (角色和角色)。map
    如何与此交互/工作
  • inject
    方法如何在
    map
    方法括号中的条件下工作

  • 我想知道这个位屏蔽是如何工作的,但我不知道等式右侧的
    def roles=(roles)
    如何返回一个整数。

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

    简言之

    步骤1是通过使用
    &
    来确定两个数组中的哪些值匹配,从而获取在角色中找到的角色

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

    第3步,对数组求和以得到最终整数

    其思想是为每个角色组合计算一个唯一的整数


    getter只需解开返回匹配角色组合的进程。

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

    简言之

    步骤1是通过使用
    &
    来确定两个数组中的哪些值匹配,从而获取在角色中找到的角色

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

    第3步,对数组求和以得到最终整数

    其思想是为每个角色组合计算一个唯一的整数


    getter只需解开进程,返回匹配的角色组合。

    1
    roles=
    是与
    role
    不同的方法名。2.Array#&:返回一个新数组,该数组包含两个数组共有的元素,没有重复项。(在鹤嘴锄中可以找到解释)“roles=是与role不同的方法名”,但第二个名为“roles”。那么您是说roles=()和roles是两个不同的方法名吗?如果是的话,我明白了。谢谢!对不起,打错了。我们说,
    roles
    是一个getter,返回一个值,
    roles=()
    是一个setter,修改值。编写
    roles=xyz
    是Ruby的一个语法糖。实际上,如果roles是一个方法,那么等号就是方法名称的一部分。但是在
    var=xyz
    中,如果var是一个变量,则等号只是赋值运算符。使用attr_accessor进行搜索将为您提供大量答案,比如Ruby的IRB非常适合自己尝试这些东西。为
    角色
    角色
    创建虚拟值,并查看
    (角色和角色)
    返回的内容。然后使用
    map
    语句查看发生了什么。堆栈溢出非常倾向于一个问题。多个问题会冲淡和混淆可能的答案,所以尽量限制它们。一两个问题是可以解决的。六个人落水了
    roles=
    是与
    role
    不同的方法名。2.Array#&:返回一个新数组,该数组包含两个数组共有的元素,没有重复项。(在鹤嘴锄中可以找到解释)“roles=是与role不同的方法名”,但第二个名为“roles”。那么您是说roles=()和roles是两个不同的方法名吗?如果是的话,我明白了。谢谢!对不起,打错了。我们说,
    roles
    是一个getter,返回一个值,
    roles=()
    是一个setter,修改值。编写
    roles=xyz
    是Ruby的一个语法糖。实际上,如果roles是一个方法,那么等号就是方法名称的一部分。但是在
    var=xyz
    中,如果var是一个变量,则等号只是赋值运算符。使用attr_accessor进行搜索将为您提供大量答案,比如Ruby的IRB非常适合自己尝试这些东西。为
    角色
    角色
    创建虚拟值,并查看
    (角色和角色)
    返回的内容。然后使用
    map
    语句查看发生了什么。堆栈溢出非常倾向于一个问题。多个问题会冲淡和混淆可能的答案,所以尽量限制它们。一两个问题是可以解决的。六个人落水了。
    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