Ruby 分享:借助位运算实现多个属性的存储与读取

class BitCollection
  def initialize(collection)
    @collection = collection
  end

  def labels(value)
    [].tap do |list|
      @collection.each_pair do |pos, label|
        list << label if (1 << (pos - 1)) & value > 0
      end
    end
  end

  def value(*labels)
    sum = 0
    labels.each do |label|
      pos = @collection.key(label)
      sum += 1 << (pos - 1)
    end
    sum
  end
end

properties = {
  1 => '公告',
  2 => '轮播',
  3 => '置顶',
  4 => '推广'
}

parser = BitCollection.new(properties)
parser.value('置顶', '推广') # => 12
parser.labels(12) # => ["置顶", "推广"]

b-property.rb
608 字节
2021-10-20
1