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

rryofs0p  于 2022-09-21  发布在  Ruby
关注(0)|答案(12)|浏览(199)

我有str1和str2。Str1可能是空字符串,也可能不是,我想构造一个如下所示的数组:

str1 = ""
str2 = "bar"
["bar"]

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

我现在只能想出一种方法来做这件事,但我知道肯定有一种方法。

jjjwad0x

jjjwad0x1#

使用Ruby 1.9

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

以Ruby 1.8表示

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

bz4sfanl2#

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

# ...or...

[str1, str2].reject &:empty?
rqdpfwrv

rqdpfwrv3#

对象号攻丝

[: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? }
fquxozlt

fquxozlt4#

You can usedelete_if:

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

If you're using Rails, you can replaceempty?byblank?

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

or use a block:

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

5us2dqdw5#

您可以使用三进制语句:

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"]
tzdcorbm

tzdcorbm6#

另一种方式,

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

jk9hmnmh7#

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

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

oalqel3c

oalqel3c8#

您可以修补Aray Pr Eumpable并提供一个条件添加方法。

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

fsi0uk1n

fsi0uk1n9#

请注意,Sawa的Ruby 1.9的proposed answer(目前得票率最高的答案)在与散列一起使用时有问题--如下所示;

> [*({foo: 1} if true), {foo: 2}]
[
    [0] [
        [0] :foo,
        [1] 1
    ],
    [1] {
        :foo => 2
    }
]

请注意,紧凑示例的工作方式与您预期的一样;

[({foo: 1} if true), {foo: 2}].compact
[
    [0] {
        :foo => 1
    },
    [1] {
        :foo => 2
    }
]
b91juud3

b91juud310#

A more compact way to do this is using presence, which returns the object if present, or nil if not.

nil values can then be stripped with .compact:

[str1.presence, str2].compact

or even better, the magical * splat operator:

[*str1.presence, str2]

(And yes, pun was intended)

4ngedf3f

4ngedf3f11#

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

tnkciper12#

在某种程度上,我感觉有两个不同的问题被问到:

1.有没有办法在一行中有条件地添加到数组中?
1.如何完成这项具体任务。

关于第一个问题:其他人已经提供了很多好的选择。但我没有具体提到的一点是,从技术上讲,您可以使用分号(;)作为内联语句分隔符,基本上可以在一行代码中编写您想要的任何内容。例如:

array = []; if x; array << a; elsif y; array << b; else; array << c; end; array

关于第二个问题:这里有一个有趣的选项,可以添加到列表中。使用chomp(separator)splitreverse方法。

str1 = ""
str2 = "bar"

"#{str2},#{str1}".chomp(",").split(",").reverse

# =>  ["bar"]

str1 = "foo"
str2 = "bar"

"#{str2},#{str1}".chomp(",").split(",").reverse

# =>  ["foo", "bar"]

带和不带reversestring.chomp(substring)可以非常方便地格式化字符串结果,否则需要一些条件语句来处理链中其他位置的相同操作。

相关问题