我有str1和str2。Str1可能是空字符串,也可能不是,我想构造一个如下所示的数组:
str1 = "" str2 = "bar" ["bar"]
或
str1 = "foo" str2 = "bar" ["foo", "bar"]
我现在只能想出一种方法来做这件事,但我知道肯定有一种方法。
jjjwad0x1#
使用Ruby 1.9
[*(str1 unless str1.empty?), str2]
以Ruby 1.8表示
[(str1 unless str1.empty?), str2].compact
bz4sfanl2#
[str1, str2].reject {|x| x==''} # ...or... [str1, str2].reject &:empty?
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? }
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 == '' }
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"]
tzdcorbm6#
另一种方式,
(str1.present? ? str1 : []) + [str2]
jk9hmnmh7#
也许是西里尔答案的一个更简洁的版本:
Array.new.tap do |array| if condition array << "foo" end end
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
array = [].add(:class, is_given?).add(object, false) #etc
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 } ]
b91juud310#
A more compact way to do this is using presence, which returns the object if present, or nil if not.
presence
nil
nil values can then be stripped with .compact:
.compact
[str1.presence, str2].compact
or even better, the magical * splat operator:
*
[*str1.presence, str2]
(And yes, pun was intended)
4ngedf3f11#
my_array = [str1, str2].find_all{|item| item != ""}
tnkciper12#
在某种程度上,我感觉有两个不同的问题被问到:
1.有没有办法在一行中有条件地添加到数组中?1.如何完成这项具体任务。
关于第一个问题:其他人已经提供了很多好的选择。但我没有具体提到的一点是,从技术上讲,您可以使用分号(;)作为内联语句分隔符,基本上可以在一行代码中编写您想要的任何内容。例如:
;
array = []; if x; array << a; elsif y; array << b; else; array << c; end; array
关于第二个问题:这里有一个有趣的选项,可以添加到列表中。使用chomp(separator)、split和reverse方法。
chomp(separator)
split
reverse
str1 = "" str2 = "bar" "#{str2},#{str1}".chomp(",").split(",").reverse # => ["bar"] str1 = "foo" str2 = "bar" "#{str2},#{str1}".chomp(",").split(",").reverse # => ["foo", "bar"]
带和不带reverse的string.chomp(substring)可以非常方便地格式化字符串结果,否则需要一些条件语句来处理链中其他位置的相同操作。
string.chomp(substring)
12条答案
按热度按时间jjjwad0x1#
使用Ruby 1.9
以Ruby 1.8表示
bz4sfanl2#
rqdpfwrv3#
对象号攻丝
所以只有一行
fquxozlt4#
You can usedelete_if:
If you're using Rails, you can replaceempty?byblank?
or use a block:
5us2dqdw5#
您可以使用三进制语句:
tzdcorbm6#
另一种方式,
jk9hmnmh7#
也许是西里尔答案的一个更简洁的版本:
Array.new.tap do |array| if condition array << "foo" end end
oalqel3c8#
您可以修补Aray Pr Eumpable并提供一个条件添加方法。
这样,它将是可链接的,保留了直线上的大部分空间。
array = [].add(:class, is_given?).add(object, false) #etc
fsi0uk1n9#
请注意,Sawa的Ruby 1.9的proposed answer(目前得票率最高的答案)在与散列一起使用时有问题--如下所示;
请注意,紧凑示例的工作方式与您预期的一样;
b91juud310#
A more compact way to do this is using
presence
, which returns the object if present, ornil
if not.nil
values can then be stripped with.compact
:or even better, the magical
*
splat operator:(And yes, pun was intended)
4ngedf3f11#
tnkciper12#
在某种程度上,我感觉有两个不同的问题被问到:
1.有没有办法在一行中有条件地添加到数组中?
1.如何完成这项具体任务。
关于第一个问题:其他人已经提供了很多好的选择。但我没有具体提到的一点是,从技术上讲,您可以使用分号(
;
)作为内联语句分隔符,基本上可以在一行代码中编写您想要的任何内容。例如:关于第二个问题:这里有一个有趣的选项,可以添加到列表中。使用
chomp(separator)
、split
和reverse
方法。带和不带
reverse
的string.chomp(substring)
可以非常方便地格式化字符串结果,否则需要一些条件语句来处理链中其他位置的相同操作。