2010-10-05 103 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