Enum.cochunk(arr,3)和Enum.coChunk_every(arr、3)之间的行为不同



我有一个平面数字数组的数据结构

[145, 46, 200, 3, 178, 206, 73, 228, 165, 65, 6, 141, 73, 90, 181, 100]

我需要制作一个数组,每个子数组最多有3个项目。所以我看了一些例子,Enum.chunk(arr, n)似乎是一个候选

所以.chuck(arr,3(说它是不推荐使用的,用chuck_every(arr(代替,所以我这样做了,它与chunk 相比产生了一个奇怪的结果

例如:chunk返回

[[145, 46, 200], [3, 178, 206], [73, 228, 165], [65, 6, 141], [73, 90, 181]]

而chunk_every返回

[145, 46, 200],
[3, 178, 206],
[73, 228, 165],
[65, 6, 141],
[73, 90, 181],
'p']

主要区别是一个额外的随机元素,它是一个字符串???

这几乎就像它转换了chunk截断的元素,并将其转换为字符串?

当然,我希望在给定相同输入的情况下,替换方法会有相同的输出。正确的

查看最后一个元素:100。CCD_ 2似乎丢弃了该值,而CCD_。这就是您看到的p字符。Elixir试图在控制台中显示为数字的字符数组,因为这是它的内部表示。

正如您在文档中看到的,您可以将:discard作为剩余参数传递,以表现为不推荐使用的chunk函数。

https://hexdocs.pm/elixir/Enum.html#chunk_every/2

CCD_ 7就是这样设计的,如果你喜欢的话,实际上是一个数字:

[145, 46, 200, 3, 178, 206, 73, 228, 165, 65, 6, 141, 73, 90, 181, 100]
|> Enum.chunk_every(3, 3, [])
|> Enum.each(fn item ->
IO.inspect item, charlists: false
end)

你可以从官方讨论中找到更多细节:

https://github.com/elixir-lang/elixir/issues/7260

有时,我们自己实现基本功能,而不是查找标准库,以获得精确控制的结果是有意义的。

这里是一个递归实现,它丢弃了尾部。

input =
[145, 46, 200, 3, 178, 206, 73, 228,
165, 65, 6, 141, 73, 90, 181, 100]
defmodule MyEnum do
def chunk_3(input), do: do_chunk_3(input, [])
defp do_chunk_3([e1, e2, e3 | rest], acc),
do: do_chunk_3(rest, [[e1, e2, e3] | acc])
defp do_chunk_3(_, acc), do: Enum.reverse(acc)
end
MyEnum.chunk_3(input)
#⇒ [[145, 46, 200],
#   [3, 178, 206],
#   [73, 228, 165],
#   [65, 6, 141],
#   [73, 90, 181]]

如果有人因为在Elixir和Phoenix上进行Udemy课程而发现自己在这里,那么数字"100〃;列为原始问题列表中的最后一个元素是不正确的。

这些数字来自该课程中的一个例子,该例子使用Erlang散列算法对字母"进行散列;asdf";。

:crypto.hash(:md5, "asdf")

在将回归的长生不老药中:

[145, 46, 200, 3, 178, 206, 73, 228, 165, 65, 6, 141, 73, 90, 181, 112]

数字112实际上是小写英文字母p的ASCII码

如上所述,Udemy课程中的功能需要更新如下:

def build_grid(%Identicon.Image{hex: hex} = image) do
hex
|> Enum.chunk_every(3, 3, :discard)
|> Enum.map(&mirror_row/1)
end

最新更新