在Ruby中,如何有条件地向对象添加几个成员?

时间:2012-07-29 05:20:25

标签: ruby

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

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满足任何条件。这不是理想的结果。

有没有方便的解决方案?

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

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