使用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
相关产品推荐
相关产品推荐

