最重要的是要记住您必须创建一个全新的列表,因此您应该考虑如何最好地获得您正在寻找的内容,而不是如何复制您将如何使用另一种语言来解决它。
例如,如果您想将项目与附近的项目进行比较,您可以压缩一个列表及其偏移量:
iex> enum = 1..5
1..5
iex> stream = Stream.drop(enum, 1) # Enum.drop/2 would also work
#Stream<[enum: 1..5, funs: [#Function<48.15162342/1 in Stream.drop/2>]]>
iex> Enum.zip(enum, stream) # Stream.zip/2 works if you're going to iterate
[{1, 2}, {2, 3}, {3, 4}, {4, 5}]
对于您的具体示例,下一个值是前一个取反值,您可以创建一个无限流并获取您需要的内容:
iex> 1 |> Stream.iterate(&-/1) |> Enum.take(3)
[1, -1, 1]
如果您只想修改一个值,则必须创建一个仅更改新值的新列表(注意这不是您想要进行多次更新的方式) :
iex> {previous, [current | next]} = Enum.split(1..5, 3)
{[1, 2, 3], [4, 5]}
iex> Enum.concat([previous, [current * 12], next])
[1, 2, 3, 48, 5]