是否相当于Ruby Enumerable#one?枚举#没有?在Elixir?

Rus*_*tam 1 enums elixir

如何实现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)

Dog*_*ert 6

我会使用Stream.filterEnum.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)

  • `Stream.filter |> Enum.take(2)`非常优雅. (3认同)