如何实现one?
和none?
在药剂的有效途径?
你觉得这个怎么样?
defmodule MyEnum do
def one?(enum, fun) do
Enum.count(enum, fun) == 1 && true || false
end
def none?(enum, fun) do
Enum.count(enum, fun) == 0 && true || false
end
end
Run Code Online (Sandbox Code Playgroud)
用法示例:
iex(6)> MyEnum.none?([0,0,0,0], fn(x) -> x == 1 end)
true
iex(7)> MyEnum.none?([0,0,1,0], fn(x) -> x == 1 end)
false
iex(8)> MyEnum.none?([0,1,1,0], fn(x) -> x == 1 end)
false
iex(9)> MyEnum.one?([0,1,1,0], fn(x) -> x == 1 end)
false
iex(10)> MyEnum.one?([0,1,0,0], fn(x) -> x == 1 end)
true
iex(11)> MyEnum.one?([0,0,0,0], fn(x) -> x == 1 end)
false
Run Code Online (Sandbox Code Playgroud)
我会使用Stream.filter
并Enum.take(2)
实施one?
.这将确保fun
在您的Enum.count
解决方案遍历整个枚举时,只会遍历最多2个匹配的元素.
因为none?
,你可以回来!Enum.any?(...)
.
defmodule MyEnum do
def one?(enum, fun) do
case enum |> Stream.filter(fun) |> Enum.take(2) do
[_] -> true
_ -> false
end
end
def none?(enum, fun) do
!Enum.any?(enum, fun)
end
end
IO.inspect MyEnum.none?([0,0,0,0], fn(x) -> x == 1 end)
IO.inspect MyEnum.none?([0,0,1,0], fn(x) -> x == 1 end)
IO.inspect MyEnum.none?([0,1,1,0], fn(x) -> x == 1 end)
IO.inspect MyEnum.one?([0,1,1,0], fn(x) -> x == 1 end)
IO.inspect MyEnum.one?([0,1,0,0], fn(x) -> x == 1 end)
IO.inspect MyEnum.one?([0,0,0,0], fn(x) -> x == 1 end)
Run Code Online (Sandbox Code Playgroud)
输出:
true
false
false
false
true
false
Run Code Online (Sandbox Code Playgroud)