Enum.chunk(arr, 3) 和 Enum.chunk_every(arr, 3) 之间的不同行为

问题描述 投票:0回答:4

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

[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 切断的元素并将其转换为字符串?

当然,我期望在给定相同输入的情况下,替换方法将具有相同的输出。对吗?

list linked-list elixir
4个回答
4
投票

查看最后一个元素:100。

chunk
似乎丢弃了该值,而
chunk_every
将其单独添加到最后一个元素。这就是您看到的
p
字符。 Elixir 尝试在控制台中显示为数字的字符数组,因为这是它的内部表示。

正如您在文档中所看到的,您可以将

:discard
作为剩余参数传递,以充当已弃用的
chunk
函数。

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


1
投票

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)

您可以从官方讨论中找到更多详细信息:

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


0
投票

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

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

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]]

0
投票

如果有人发现自己在这里是因为他们正在学习 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
© www.soinside.com 2019 - 2024. All rights reserved.