最常见的方法是从几个没有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
不一定要考虑。变量是真值(数字/字符串/数组/哈希)或nil
。
如果您担心性能,最好的方法可能是使用破坏性的#compact!
以避免为第二个数组分配内存。
我希望有一种方法可以在数组创建过程中以某种方式“跳过” 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
这会将代码移到其他地方。
从面向对象的角度来看,nil
没什么特别的-它是与其他对象一样的对象。因此,删除nil
与删除1
没有区别。
另一方面,在编写面向对象的代码时,我试图避免使用一堆if
语句。我更喜欢向对象发送消息。
[[...]
withcompact
/ compact!
[[...]
和<<
和if
语句
我可能会使用compact
,可能很明显。
这里是使用哈希的解决方案。
将这些值放入数组中:
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)
轻松删除。