我有一个平面数字数组的数据结构
[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, 3) 代替,所以我这样做了,它产生了一个与 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。
chunk
似乎丢弃了该值,而chunk_every
将其单独添加到最后一个元素。这就是您看到的 p
字符。 Elixir 尝试在控制台中显示为数字的字符数组,因为这是它的内部表示。
正如您在文档中所看到的,您可以将
:discard
作为剩余参数传递,以充当已弃用的 chunk
函数。
Enum.chunk_every/4
就是这样设计的,
如果你这样做的话,实际上它是一个数字:
[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)
您可以从官方讨论中找到更多详细信息:
有时,为了获得精确控制的结果,我们自己实现基本功能而不是查找标准库是有意义的。
这是一个递归实现,丢弃尾部。
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”是不正确的。
这些数字来自该课程中的一个示例,该示例对字母“asdf”使用 Erlang 哈希算法。
:crypto.hash(:md5, input)
在将返回的 Elixir 中:
[145, 46, 200, 3, 178, 206, 73, 228, 165, 65, 6, 141, 73, 90, 181, 112]
数字112是小写英文字母的ASCII码
p
如上所述,Udemy 课程中的功能需要更新为:
def build_grid(%Identicon.Image{hex: hex} = image) do
hex
|> Enum.chunk_every(3, 3, :discard)
|> Enum.map(&mirror_row/1)
end