在灵丹妙药中,如果我在列表上操作,则得到3的倍数:
1..10 |> Enum.filter(fn(x) -> (rem(x,3) == 0) end)
输出:[3, 6, 9]
如果我添加或声明:
1..10 |> Enum.filter(fn(x) -> (rem(x,3) == 0 || rem(x,5)) end)
输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
为什么or语句(已被括起来)会产生意外的输出?
答案 0 :(得分:6)
rem/2
将返回一个整数作为结果 - 所有整数在Elixir中都是真实的,包括0
。这意味着rem(x, 5)
始终是真实的,过滤函数将始终生成真实并保留所有项目。您可能打算使用:
iex(1)> 1..10 |> Enum.filter(fn(x) -> rem(x,3) == 0 || rem(x,5) == 0 end)
[3, 5, 6, 9, 10]