我想创建一个哈希,其中有几个成员有条件地添加。 简单的方法是:
var a = {}
a['b'] = 5 if condition_b
a['c'] = 5 if condition_c
a['d'] = 5 if condition_d
现在,我想写一个更惯用的代码。我在尝试:
a = {
b => (condition_b? 5 : null),
c => (condition_c? 5 : null),
d => (condition_d? 5 : null)
}
但是现在,a.length
等于3满足任何条件。这不是理想的结果。
有没有方便的解决方案?
答案 0 :(得分:1)
可能不是你想要的,但这可以帮助
array = ['b','c','d'] ##array of values you want as keys
a ={}
array.each do |val|
a[val] = 5 if send("condition_"+val.to_s) #call method condition_#{key_name}
end
如果条件不相关,您可以使用自己的哈希值,
a = {
b => (condition_b? 5 : nil),
c => (condition_c? 5 : nil),
d => (condition_d? 5 : nil)
}
a.values.compact.size
获取除nil之外的其他值的长度
答案 1 :(得分:0)
如果条件满足,你只会添加哈希值,如下所示:
a = {}
a.merge!({'b'=>5}) if condition_b
a.merge!({'c'=>5}) if condition_c
答案 2 :(得分:-1)
在第二种方式中,你总是会有三把钥匙;条件仅确定特定值。因此,如果您想使用该语法,您将需要定义一个自定义方法,如果它们不是nil,则只计算键(同样,它在Ruby中为零,而不是null)。类似的东西:
def non_nil_length(hash)
i = 0
hash.each_pair do |k,v|
if !v.nil?
i += 1
end
end
i
end
可能有更好的方法可以做到这一点,但有快速和肮脏。