Arrays Ruby将修改后的数组保存在变量中,而不更改原始数组

Arrays Ruby将修改后的数组保存在变量中,而不更改原始数组,arrays,ruby,Arrays,Ruby,我想将数组的值保存在两个变量中,不包括第一个和最后一个元素 prices = [9, 3, 5, 2, 1] except_first = prices.last(prices.size-1) except_last = prices.first(prices.size-1) 例如: prices = [9, 3, 5, 2, 1] 我需要的要素是: prices_excl_first = [3, 5, 2, 1] prices_excl_last = [9, 3, 5, 2] 我想出了

我想将数组的值保存在两个变量中,不包括第一个和最后一个元素

prices = [9, 3, 5, 2, 1]
except_first = prices.last(prices.size-1)
except_last = prices.first(prices.size-1)
例如:

prices = [9, 3, 5, 2, 1]
我需要的要素是:

prices_excl_first = [3, 5, 2, 1]

prices_excl_last = [9, 3, 5, 2]
我想出了几种方法从数组中删除元素,包括通过将其索引传递给slice方法来切掉值,如下所示:

first_price = prices.slice(0)
last_price = prices.slice(-1)
然后,我们可以将修改后的数组保存到变量中:

array_except_first_price = prices.delete(first_price) #=> [3, 5, 2, 1]
array_except_last_index = prices.delete(last_price) #=> [3, 5, 2]
这有两个问题:

数组除最后一个索引外,现在不包含第一个元素 我以后还需要获得完整的原始阵列价格 因此,从本质上讲,在问题中需要时,如何临时修改数组中的元素

从阵列中切片和删除元素会永久影响阵列。

在执行破坏性操作之前,可以使用dup复制阵列

prices = [9, 3, 5, 2, 1]

except_first = prices.dup
except_first.delete_at 0

except_last = prices.dup
except_last.delete_at -1
这会导致阵列重复几次。如果处理的是大型阵列,这可能是个问题。

在执行破坏性操作之前,可以使用dup复制阵列

prices = [9, 3, 5, 2, 1]

except_first = prices.dup
except_first.delete_at 0

except_last = prices.dup
except_last.delete_at -1
这会导致阵列重复几次。如果您处理的是大型数组,这可能是一个问题。

Ruby必须复制第一个和最后一个元素

prices = [9, 3, 5, 2, 1]
except_first = prices.last(prices.size-1)
except_last = prices.first(prices.size-1)
询问第一个和最后一个价格

prices = [9, 3, 5, 2, 1]
except_first = prices.last(prices.size-1)
except_last = prices.first(prices.size-1)
Ruby必须复制第一个和最后一个元素

prices = [9, 3, 5, 2, 1]
except_first = prices.last(prices.size-1)
except_last = prices.first(prices.size-1)
询问第一个和最后一个价格

prices = [9, 3, 5, 2, 1]
except_first = prices.last(prices.size-1)
except_last = prices.first(prices.size-1)

@Schwern的答案可能是你能得到的最好答案。下面是第二个最好的:

prices = [9, 3, 5, 2, 1]
prices[1..-1] # => [3, 5, 2, 1]
prices[0..-2] # => [9, 3, 5, 2]
或者选择与您的问题措辞更接近的选项

prices.drop(1) # => [3, 5, 2, 1]
prices.take(prices.size-1) # => [9, 3, 5, 2]

@Schwern的答案可能是你能得到的最好答案。下面是第二个最好的:

prices = [9, 3, 5, 2, 1]
prices[1..-1] # => [3, 5, 2, 1]
prices[0..-2] # => [9, 3, 5, 2]
或者选择与您的问题措辞更接近的选项

prices.drop(1) # => [3, 5, 2, 1]
prices.take(prices.size-1) # => [9, 3, 5, 2]
您可以使用:

您可以使用:

挥舞它

*a, d = prices                                                
c, *b = prices

a #=> [9, 3, 5, 2]
b #=> [3, 5, 2, 1]
挥舞它

*a, d = prices                                                
c, *b = prices

a #=> [9, 3, 5, 2]
b #=> [3, 5, 2, 1]

也许和。每个方法都有一个可选的参数。很明显,如果它是prices=[5,5,10,10],你想要[5,10,10]和[5,5,10]?这就是删除第一个和最后一个元素。或者你想要[10,10]和[5,5]?这会降低第一个和最后一个值。@orde感谢您的指导!我现在得到了它,因为我可以得到数组的总长度,这可以传递到第一个和最后一个方法中。@Schwern我想删除第一个和最后一个元素。这是一个伟大的点,你用重复的值,虽然@user9503053我可以问一下您为什么要排除第一个/最后一个价格吗?它们有特殊的意义吗?也许还有。每个方法都有一个可选的参数。很明显,如果它是prices=[5,5,10,10],你想要[5,10,10]和[5,5,10]?这就是删除第一个和最后一个元素。或者你想要[10,10]和[5,5]?这会降低第一个和最后一个值。@orde感谢您的指导!我现在得到了它,因为我可以得到数组的总长度,这可以传递到第一个和最后一个方法中。@Schwern我想删除第一个和最后一个元素。这是一个伟大的点,你用重复的值,虽然@user9503053我可以问一下您为什么要排除第一个/最后一个价格吗?它们有特别的意义吗?值得注意的是,放弃/接受方法很好,因为它可以很容易地变得懒惰。Ruby 2.0+Sergio中的prices.lazy.drop1,我不知道如何改进您的1解决方案。您所做的一切都是可以立即理解的,不涉及任何计算,而且它得到了与hills一样古老的Ruby版本的支持。@CarySwoveland:只有在您以前看过range taking array indexer并了解负索引的情况下,才可以立即理解。老实说,我认为初学者更容易理解first/last。如果必须删除最后一个元素,我会使用range,如果必须省略第一个元素,我会使用range。回想我自学Ruby时,我记得很早就接触过Arrayslice,觉得它很酷。当然,其他人可能有不同的经历。值得注意的是,放弃/接受方法很好,因为它很容易变得懒惰。Ruby 2.0+Sergio中的prices.lazy.drop1,我不知道如何改进您的1解决方案。您所做的一切都是可以立即理解的,不涉及任何计算,而且它得到了与hills一样古老的Ruby版本的支持。@CarySwoveland:只有在您以前看过range taking array indexer并了解负索引的情况下,才可以立即理解。老实说,我认为初学者更容易理解first/last。如果必须删除最后一个元素,我会使用range,如果必须省略第一个元素,我会使用range。回想我自学Ruby时,我记得很早就接触过Arrayslice,觉得它很酷。当然,其他人可能有不同的体验。你也可以使用特殊的变量名,而不是d和c。如果你不使用ruby-w-e def splat_it,ruby不会抱怨;价格=[9,3,5,2,1]*a、 _u=价格;通讯社终止splat_it=没有警告,而如果y
ou使用d;如果你需要/想要在其他地方使用d,你可以忽略这个注释。你也可以使用特殊的变量名,而不是d和c。如果你不使用它,ruby不会抱怨ruby-w-e def splat_;价格=[9,3,5,2,1]*a、 _u=价格;通讯社终止splat_it=没有警告,而如果使用d,则会收到警告;如果你需要/想要在其他地方使用d,你可以忽略这个注释。加1表示聪明,只有一行。加1表示聪明,只有一行。