假设我有一个数组[1,2,3,1,2,3]
,我想从中删除第一个(比如说)2
,使其变为[1,3,1,2,3]
。最简单的方法是什么?
li.delete_at(li.index(n) || li.length)
li[li.length]
超出了范围,因此|| li.length
处理n
不在列表中的情况。
irb(main):001:0> li = [1,2,3,1,2,3]
=> [1, 2, 3, 1, 2, 3]
irb(main):002:0> li.delete_at(li.index(2) || li.length)
=> 2
irb(main):003:0> li.delete_at(li.index(42) || li.length)
=> nil
irb(main):004:0> li
=> [1, 3, 1, 2, 3]
|| li.length
是为了避免将 nil
传递给 li.delete_at
(这会导致 TypeError),那么更易读的版本可能是这样的:
li.delete_at(li.index(42)) unless li.index(42).nil?
li.index(42)
存储在一个变量中。对于大型数组,性能会更好。 - Kelvinclass Array
def delete_first item
delete_at(index(item) || length)
end
end
delete_at(index(item) || length)
非常容易,但否则并不明显。delete_first
非常好用。 - stevec
|| li.length
,可以有人解释一下吗? - gatesfalse
和nil
会被视为假。双竖线语法是一种方便的简写方式。a || b
的意思是“如果 a 不是 nil,则为 a,否则为 b”。 - Eric Haynesli.length
是另一种说法吗?意思是“不要删除任何东西(因为length(n)总是超出数组范围,并返回'nil')”? - stevecdelete_at
。不过,在检查之后,这些变量有点多余。例如,index = arr.index(3) && arr.delete_at(index)
之后会保留index
变量。 - Eric Haynes