You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Enum.chunk_every传入:discard触发FunctionClauseError求助

解决Elixir Enum.chunk_every的FunctionClauseError问题

错误原因

你调用Enum.chunk_every(hex, 3, :discard)时,Elixir将:discard解析为step参数(对应chunk_every/4的第三个参数),但该参数的guard条件要求必须是大于0的整数,:discard不符合类型要求,因此触发FunctionClauseError。

解决方案

要实现将列表按每3个元素分块并丢弃最后不足3个的元素,以下两种方式都能满足需求:

方式一:兼容所有Elixir版本(推荐)

使用Enum.chunk_every/4,明确指定step为3(与分块长度一致),并将剩余元素处理方式设为:discard:

def buildGrid(%Identicon.Image{hex: hex}=image) do
    hex
    |> Enum.chunk_every(3, 3, :discard)
end

参数说明:

  • 3(第一个数字):每个子列表的长度
  • 3(第二个数字):分块的步长(每次分块后跳过3个元素,实现无重叠分块)
  • :discard:丢弃最后长度不足3的剩余元素

方式二:仅适用于Elixir 1.15+

利用Elixir 1.15新增的Enum.chunk_every/3模式,直接传入:discard作为第三个参数:

def buildGrid(%Identicon.Image{hex: hex}=image) do
    hex
    |> Enum.chunk_every(3, :discard)
end

验证结果

用你的原列表[23, 137, 4, 86, 54, 223, 37, 191, 22, 167, 25, 238, 102, 56, 39, 4]测试,两种方式都会输出期望结果:
[[23, 137, 4], [86, 54, 223], [37, 191, 22], [167, 25, 238], [102, 56, 39]]

内容的提问来源于stack exchange,提问作者Maninder Singh Rehalan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:44:59