位运算有一些基础的操作比如说,与、或、非、异或。
其实是可以通过位运算来判断是否具有某一个权限,比如 Linux 操作系统里面的 chmod
命令中经常会看到 chmod 777
或者 chmod a+x
这样的代码,这个都代表修改某个东西的权限。
所以这个数字呢也就代表为权限。
PERM = {
create: 1,
read: 1 << 1,
update: 1 << 2,
delte: 1 << 3,
}
class User
def initialize
@perm = 0
end
def add_perm(p, *rest)
@perm |= p # | 增加权限其实就是或的操作
rest.each do |x|
@perm |= x
end
@perm
end
def delete_perm(p)
@perm ^= p # ^ 删除权限其实就是异或的操作
end
def can?(p)
!(@perm & p).zero? # & 判断是否具有权限其实就是与的操作,看看结果是不是 0
end
end
u = User.new()
puts (u.can? PERM[:create]) # false
u.add_perm PERM[:create]
puts (u.can? PERM[:create]) # true
u.delete_perm PERM[:create]
puts (u.can? PERM[:create]) # false
u.add_perm PERM[:create], PERM[:read], PERM[:update]
puts (u.can? PERM[:create]) # true
位运算用于判断权限的时候,一般会是在代码中把一些操作写成枚举类型,或者写成一些常量,这样是为了减少数据库的操作从而达成快速判断的目的。
当你想到要把这些权限表存到数据库的时候,你就走远了,可以,但没必要。理应按照那种更可读的方式去制作权限表。