0

我想创建一个有条件地添加几个成员的哈希。简单的方法是:

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。这不是预期的结果。

有没有方便的解决方案?

4

3 回答 3

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 以外的值的长度

于 2012-07-29T07:06:43.717 回答
0

如果满足条件,您只添加到哈希中怎么样,如下所示:

a = {}
a.merge!({'b'=>5}) if condition_b
a.merge!({'c'=>5}) if condition_c
于 2013-01-27T11:29:36.740 回答
-1

第二种方式,你总是会拥有三把钥匙;条件仅确定特定值。因此,如果您想使用该语法,您将需要定义一个自定义方法,该方法仅在键不为 nil 时计算键(此外,在 Ruby 中它是 nil,而不是 null)。就像是:

def non_nil_length(hash)
  i = 0
  hash.each_pair do |k,v|
    if !v.nil?
      i += 1
    end
  end
  i
end

可能有更好的方法来做到这一点,但有快速和肮脏的方法。

于 2012-07-29T05:41:02.967 回答