我有一个平面数字数组的数据结构
[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