2014-06-24 82 views
0

我有一個實例變量,它是一個數組。我想刪除最後兩個元素和前三個元素。然後我想刪除任何值= nil的值。Array drop not saving

的下降是不節能,但:

@attribute_names = [] 

<% @attribute_names = word.attribute_names %> 
    <% @attribute_names.pop(2) %> 
    <% @attribute_names.drop(3) %> 
<td> <%= @attribute_names %> </td> 

彈出的工作,但降不表中的數據的工作。這是爲什麼?

+0

你不應該在視圖中做「流行」和「拖放」。相反,在您訪問的控制器中創建第二個已經被操縱的變量,或者直接使用'word.attribute_names [2 ..- 4]'。 –

+0

等同於'pop'的方法是'shift'。 – steenslag

回答

2

方法pop從數組中刪除元素並返回它。

該方法drop返回一個新的陣列沒有X的第一個元素 - 接收器保持不變!

如果你要刪除的接收器的前三個元素,你可以使用slice!

a = [1, 2, 3, 4, 5, 6] 
a.pop 
# => 6 
a 
# => [1, 2, 3, 4, 5] 
a.drop(3) 
# => [4, 5] 
a 
# => [1, 2, 3, 4, 5] 
a.slice!(0, 3) 
# => [1, 2, 3] 
a 
# => [4, 5] 
+0

想知道是否有辦法讓drop()返回相同的數組而不是新的數組? – DDDD

+0

@DDDD - 使用'切片!'(更新我的答案) –

1

Array#[range]將做到這一點:

@attribute_names = @attribute_names[2...-3] 

考慮將這種邏輯成爲一個輔助方法,在那裏可以給它一個名字,解釋爲什麼一些元素被跳過。

+0

我會考慮使用輔助方法。 +1 – DDDD