我想计算一个字符串中出现的字数.实现是有问题的,但让我们用它来演示我的问题:
def count(sentence) do words = String.split(sentence) occurrences = Enum.map(words, fn w -> {w, Enum.count(words, &(&1 == w))} end) Map.new(occurrences) end
我想获得与上面相同的结果,但使用管道而不是中间结果变量:
def count(sentence) do sentence |> String.split |> Enum.map(fn w -> {w, Enum.count(???)} end) |> Map.new end
是否可以在Enum.count函数中引用管道值?或者我必须使用中间变量?
您可以在管道中放置一个匿名函数:
def count(sentence) do sentence |> String.split |> (fn words -> Enum.map(words, fn w -> {w, Enum.count(words, &(&1 == w))} end) end).() |> Map.new end
iex(1)> count("foo bar baz foo") %{"bar" => 1, "baz" => 1, "foo" => 2}
尽管@ Dogbert的答案是完全正确的,但我会添加一个旁注:似乎只要你需要两次输出值,你就可能做错了.上面的示例可能会被重写为:
def count(sentence) do
sentence
|> String.split
|> Enum.reduce(%{}, fn e, acc ->
Map.put(acc, e, (Map.get(acc, e) || 0) + 1)
end)
end
或者以许多其他方式,减少所涉及的循环量(因此,整个函数的大O).