位运算-基操勿6皆坐

位运算有一些基础的操作比如说,与、或、非、异或。
其实是可以通过位运算来判断是否具有某一个权限,比如 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

位运算用于判断权限的时候,一般会是在代码中把一些操作写成枚举类型,或者写成一些常量,这样是为了减少数据库的操作从而达成快速判断的目的。
当你想到要把这些权限表存到数据库的时候,你就走远了,可以,但没必要。理应按照那种更可读的方式去制作权限表。

暂无评论