2010-10-05 63 views
4

我想创建一个位,它包含给定用户的安全权限。红宝石撞位

在c#中,我会通过创建一个枚举来做到这一点,然后通过'& &'来查看它是否会导致TRUE值。

我该如何在Ruby中做到最好?

+2

为什么你希望它是一个位字段,而不是一个哈希或一些其他层次的概念? – einarmagnus 2010-10-05 21:21:23

+2

你的意思是按位和'&'不是逻辑和'&&',当然? – horseyguy 2010-10-05 23:50:26

回答

13

如果底层的价值是很重要的,那么你可以创建你使用像一个枚举

module Groups 
    ADMIN = 1 
    BOSS = 2 
    CLERK = 4 
    MEAT = 8 
    BREAD = 16 
    CHEESE = 32 
end 

要设置权限的模块只是按位or在一起

permissions = Groups::BOSS | Groups::MEAT | Groups::CHEESE 

,并测试你做一个按位and

>> permissions & Groups::CHEESE > 0 
=> true 
>> permissions & Groups::BREAD > 0 
=> false 

我也喜欢你如何可以使实际位掩码更具可读性与_这样

permissions = 0b0010_1010 
+0

我不明白最后一部分,什么是0b0010_1010? – Blankman 2010-10-06 14:10:49

+0

它与'p = 0b00101010'相同,它只是一种使二进制文字更具可读性的方法。 – 2010-10-06 16:45:43

+1

除非您打算实例化它们,否则不应该创建类。为此目的,你应该使用模块来代替('module Groups' ...) – Hubro 2013-10-24 07:41:38

1

Ryan Bates谈到了使用按位操作嵌入关联的podcast。您可以阅读文本版本here

4

Bitwse操作在Ruby中微不足道。

> 1 | 2 # Create a bitmask from permission 2^0 + 2^1 
=> 3 

> 3 & 1 == 1 # See if the bitmask contains the 2^0 permission 
=> true 

> 3 & 4 == 4 # See if the bitmask contains the 2^2 permission 
=> false