有没有办法在一行中有条件地添加数组?

时间:2011-05-19 22:16:46

标签: ruby-on-rails ruby

我有str1和str2。 str1可能是或不是一个空字符串,我想构建一个像:

这样的数组
str1 = ""
str2 = "bar"
["bar"]

str1 = "foo"
str2 = "bar"
["foo", "bar"]

我现在只能想办法在两条线上做这个,但我知道必须有办法做到这一点。

9 个答案:

答案 0 :(得分:14)

[str1, str2].reject {|x| x==''}

答案 1 :(得分:12)

在ruby 1.9中

[*(str1 unless str1.empty?), str2]

在ruby 1.8中

[(str1 unless str1.empty?), str2].compact

答案 2 :(得分:3)

您可以使用 delete_if

['', 'hola'].delete_if(&:empty?)

如果你正在使用Rails,你可以用空白替换空?

['', 'hola'].delete_if(&:blank?)

或使用块:

['', 'hola'].delete_if{ |x| x == '' }

答案 3 :(得分:3)

Object#tap

[:starting_element].tap do |a|
  a << true if true
  a << false if false
  a << :for_sure
end
# => [:starting_element, true, :for_sure]

所以在一行

[].tap { |a| [foo, bar].each { |thing| a << thing unless thing.blank? } }
[bar].tap { |a| a << bar unless foo.blank? }

答案 4 :(得分:1)

另一种方式,

(str1.present? ? str1 : []) + [str2]

答案 5 :(得分:1)

也许是西里尔答案的更简洁版本:

Array.new.tap do |array| if condition array << "foo" end end

答案 6 :(得分:0)

您可以使用三元声明:

ary = (str1.empty?) ? [ str2 ] : [ str1, str2 ]

str1 = ''; str2 = 'bar'
(str1.empty?) ? [ str2 ] : [ str1, str2 ] #=> ["bar"]
str1 = 'foo'; str2 = 'bar'
(str1.empty?) ? [ str2 ] : [ str1, str2 ] #=> ["foo", "bar"]

答案 7 :(得分:0)

my_array = [str1, str2].find_all{|item| item != ""}

答案 8 :(得分:0)

你可以修补Aray pr Enumerable并提供条件添加方法。

module Array
 def add_if(object, condition=true)
   self << object if condition
   return self
 end
end

这样,它可以链接,保留大部分空间。 array = [].add(:class, is_given?).add(object, false) #etc