当前位置:  开发笔记 > 编程语言 > 正文

在Elixir中引用管道值

如何解决《在Elixir中引用管道值》经验,为你挑选了2个好方法。

我想计算一个字符串中出现的字数.实现是有问题的,但让我们用它来演示我的问题:

  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函数中引用管道值?或者我必须使用中间变量?



1> Dogbert..:

您可以在管道中放置一个匿名函数:

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}



2> Aleksei Mati..:

尽管@ 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).

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有