我有一个默认值为0:Hash.new(0)的散列。
假设一个整数值,是否有一种方法来设置一个“地板”,例如,如果该值在地板下面,则返回该地板吗?
示例:
h = Hash.new(0)
h.floor = 0
h[:five] += 5
h[:five]
#=> 5
h[:negative_five] -= 5
h[:negative_five]
#=> 0发布于 2015-06-08 13:13:40
下面是一个可能的实现
class MyHash < Hash
attr_writer :floor
def [](key)
# you can use one of those two lines or your own code in case the floor hasn't been define
# raise 'floor value must be defined' if @floor.nil?
# super key if @floor.nil?
value = (fetch(key) < @floor ? @floor : fetch(key))
end
end发布于 2015-06-08 14:36:05
下面是一个新的实现,它反映了不应将任何值存储在下限以下:
class FlooredHash < Hash
attr_writer :floor
def floor
@floor || -(2 ** 32) # setting the default floor for all FlooredHashes
end
def []=(key, value)
super(key, [value, floor].max)
end
end请注意,如果需要,您也必须重新定义#store。
发布于 2015-06-08 13:33:03
现在我用这个:
def enforce_floor!(hash, floor)
hash.each do |key, value|
hash[key] = floor if value < floor
end
end它很有效,但我认为也许有一个更优雅的解决方案。
https://stackoverflow.com/questions/30709390
复制相似问题