【发布时间】:2011-06-03 11:27:43
【问题描述】:
假设我有数组[1,2,3,1,2,3],我想从数组中删除(比如说)2 的第一个实例,给出[1,3,1,2,3]。最简单的方法是什么?
【问题讨论】:
假设我有数组[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 谁能解释一下
false 和 nil 评估为 false。双管道语法是一种方便的简写。 a || b 的意思是“a,除非它是 nil,然后是 b”。
li.length 只是另一种说法“不要删除任何东西(因为长度(n)总是超出数组,并返回'nil'?”
nil 时才执行delete_at。不过,这些变量在检查后有点混乱。例如。 index = arr.index(3) && arr.delete_at(index) 之后留下 index 变量。
如果|| li.length 是为了避免将nil 发送到li.delete_at(这会导致TypeError),那么更易读的版本可能如下所示
li.delete_at li.index(42) unless li.index(42).nil?
【讨论】:
li.index(42) 存储在一个变量中,以防止进行两次搜索。大型阵列的性能会好得多。
也许它应该成为标准库的一部分:
class Array
def delete_first item
delete_at(index(item) || length)
end
end
【讨论】:
delete_at(index(item) || length) 当你知道它时非常容易,但在其他情况下并不明显。 delete_first 很不错。