ChatGPT解决这个技术问题 Extra ChatGPT

Ruby:从数组中删除第一个元素的最简单方法是什么?

假设我有一个数组

[0, 132, 432, 342, 234]

摆脱第一个元素的最简单方法是什么? (0)

'shift' 是流行,'unshift' 是推。其中 shift 接受要弹出的参数数量

J
Joshua Pinter

使用 .drop(1)。

这样做的好处是返回一个删除了第一个元素的新数组,而不是使用 .shift,它返回删除的元素,而不是删除第一个元素的数组。

注意:它不会影响/改变原始数组。

a = [0,1,2,3]

a.drop(1)
# => [1, 2, 3] 

a
# => [0,1,2,3]

而且,此外,您可以删除的不仅仅是第一个元素:

[0,1,2,3].drop(2)
=> [2, 3]

[0,1,2,3].drop(3)
=> [3] 

最佳答案,因为 (a) 评估为修剪后的数组,并且它在空数组上按预期工作:[].drop(1) => []
也是最好的答案,因为 OP 说“摆脱第一个元素的最简单方法是什么”
这个答案表明,即使第一个和例外的答案已经超过 100 票,建议向下滚动。谢谢你。
+1,因为这会返回一个修改后的数组,而 shift 会改变数组并返回移位的元素(如果数组为空,则返回 nil
伙计们,OP没有指定他们是否希望该操作改变原始数组。所以这个答案并不比#shift的公认答案好。事实上,#shift 更适合 OP 的“摆脱”IMO 的措辞。但是,完整的答案将同时提供#shift 和#drop 并解释差异。
b
bragboy

对数组使用 shift 方法

>> x = [4,5,6]
=> [4, 5, 6]                                                            
>> x.shift 
=> 4
>> x                                                                    
=> [5, 6] 

如果要删除 n 个起始元素,可以使用 x.shift(n)


由于内容相同,解释应合并到正确答案中
S
Sjoerd

“弹出”数组的第一个元素称为“shift”(“unshift”是在数组前面添加一个元素的操作)。


请注意,这会改变数组并在空数组上返回 nil。如另一个答案中所述,请参阅 drop 以获取替代方案。
S
SylvainB
[0, 132, 432, 342, 234][1..]
=> [132, 432, 342, 234]

因此,与 shiftslice 不同,它返回一个新数组,保持原始数组不变(对一个衬里有用)。


需要注意的一个问题:如果数组为空,则返回 nil:[][1..-1] => nil 而不是 []
[1,2,3].shift 不是单行吗?
@thekingoftruth:是的,但它计算的是你扔掉的元素,而不是数组的其余部分,所以它需要另一行。
我喜欢这个答案,因为它是一个可以在任何地方使用的单行 expression。为避免 [] vs nil 问题,您可以执行 arry[1..-1] || []。但是 arry.drop(1) 更好。
我要使用这个,因为它很简单,您将如何获得“数组减去移出的内容”,我看不出它是如何工作的……这是主要答案,但似乎没有回答问题,因为下一步对新手来说并不明显!
C
Community

这很整洁:

head, *tail = [1, 2, 3, 4, 5]
#==> head = 1, tail = [2, 3, 4, 5]

正如评论中所写,不改变原始列表的好处是。


非常聪明,并且完美地工作。完成此操作后,您将拥有“head”和“tail”两个变量供您使用。
这让我想起了很多口齿不清。 (let ((head (car mylist)) (tail (cdr mylist)) ...)
@hurikhan77 不错!我一直想试一试。知道 Darcs 是用 Haskell 编写的,这激起了我的兴趣。
这个版本还有一个好处就是不改变原列表
无需额外步骤即可提取信息时很有用 header, *properties = CSV.read(file_path,encoding: 'ISO-8859-1')
z
zzzhc

a.delete_at 0


R
Rahul Patel

使用移位方法

array.shift(n) => Remove first n elements from array 
array.shift(1) => Remove first element

https://ruby-doc.org/core-2.2.0/Array.html#method-i-shift


M
Matthew Flaschen

您可以使用:

a.slice!(0)

slice! 泛化到任何索引或范围。


l
lalit.sethi143

您可以使用 Array.delete_at(0) 方法删除第一个元素。

 x = [2,3,4,11,0]
 x.delete_at(0) unless x.empty? # [3,4,11,0]

我不认为 unless x.empty? 是必要的。如果索引超出范围,它只会返回 nil
d
de-russification

您可以使用:

arr - [arr[0]]

或者

arr - [arr.shift]

或者干脆

arr.shift(1)

arr - [arr[0]] 这对于 a = [1,2,3,4,5,6,7,8,1,2,3,4] 会失败,因为 1 重复了。
s
sam

您可以使用:

 a.delete(a[0])   
 a.delete_at 0

两者都可以工作