从没有nil
值的多个变量创建数组的最常用方法是什么?
鉴于这些变量:
a = 1
b = nil
c = 3
我想创建一个数组ary
:
ary #=> [1, 3]
我可以使用Array#compact
:
ary = [a, b, c].compact
ary #=> [1, 3]
但是将所有内容放在数组中只是为了删除某些元素后感觉不对。
另一方面,使用if
语句会产生更多代码:
ary = []
ary << a if a
ary << b if b
ary << c if c
ary #=> [1, 3]
是否存在其他或首选方式或使用上述任何一种方法有任何优点或缺点?
PS:false
并不一定要考虑。变量是truthy(数字/字符串/数组/哈希)或nil
。
答案 0 :(得分:3)
如果您担心性能,最好的方法可能是使用破坏性#compact!
来避免为第二个数组分配内存。
答案 1 :(得分:1)
我希望在数组创建过程中以某种方式“跳过”nil
值。但是在考虑了一段时间之后,我意识到由于Ruby处理多个值的方法,这无法实现。没有值“列表”的概念,多个值总是表示为数组。
如果您指定多个值,Ruby会创建一个数组:
ary = 1, nil, 3
#=> [1, nil, 3]
采用可变数量参数的方法相同:
def foo(*args)
args
end
foo(1, nil, 3)
#=> [1, nil, 3]
因此,即使我使用类方法Array
修补new_without_nil
,我最终还是会选择:
def Array.new_without_nil(*values)
values.compact!
values
end
这只是将代码移到别处。
从OO的角度来看,nil
并没有什么特别之处 - 它就像其他任何对象一样。因此,删除nil
与删除1
没有区别。
另一方面,使用一堆if
语句是我在编写面向对象代码时要避免的。我更喜欢向对象发送消息。
[...]
与compact
/ compact!
[...]
和<<
声明的 if
我会使用compact
,可能很明显。
答案 2 :(得分:0)
这是使用哈希的解决方案。
将这些值放入数组中
a = 1; b = nil; c = 3; d = nil; e = 10;
ary = [a, b, c, d, e]
结果中有两个零项,需要compact
才能删除两个“零”项。
但是将相同的变量添加到哈希中:
a = 1; b = nil; c = 3; d = nil; e = 10;
hash = {a => nil, b => nil, c => nil, d => nil, e => nil}
结果中只有一个“零”项可以被hash.delete(nil)
轻松删除。