【问题标题】:Elixir: How to write Enum.map in block instead of Anonymous function?Elixir:如何在块中编写 Enum.map 而不是匿名函数?
【发布时间】:2019-12-02 23:21:09
【问题描述】:

我有一个生成关键字列表的函数,我想在调用刮板函数之前编写多行代码,如何使用 map 将其写入块中?

Enum.map(elements, fn(x) -> Scraper.Abc.markup(x) end)

我想写很多代码行,我可以使用 for 循环但它不会给我任何结果

for elements <- x do
 x
 |> ...
 |> ...
 |> ...
 |> Scraper.Abc.markup
end

有什么帮助吗?

【问题讨论】:

  • 为什么不只是Enum.map(elements, fn(x) -&gt; x |&gt; ... |&gt; ... |&gt; ... |&gt; Scraper.Abc.markup() end)?另外作为一个旁注,这不是一个 for 循环,虽然它看起来像一个,但它被称为列表推导,它会返回一个值。
  • 您能否更新您的问题以显示您的确切输入和所需的输出?目前还不清楚你在问什么。
  • @JustinWood 我想拆分成块,因为 fn(x) -> x |> ... |> ... |> ... |> 如果我有很多功能会太长运行
  • Kernel.SpecialForms.for/1 确实是你想要的。

标签: elixir


【解决方案1】:

由于某种原因您对理解不满意(为什么?)我会生成一个辅助函数并在 map 中使用它。

defmodule Utils do
  def do_stuff(x) do
    x
    |> ...
    |> ...
    |> ...
    |> ...
    |> Scraper.Abc.markup()
  end
end

Enum.map(elements, &Utils.do_stuff/1)

【讨论】:

    【解决方案2】:

    我想在调用scraper函数之前写多行代码,

    defmodule A do
      def go do
    
        list = Enum.map([1, 2, 3], fn(x) -> 
          IO.puts "hello #{x}"
          str = String.upcase("goodbye #{x}")
          spawn(fn -> IO.puts str end)
          {:result, 2*x}
        end)
    
        IO.puts "list = #{inspect list}"
    
      end
    end
    

    在 iex 中:

    iex(1)> A.go     
    hello 1
    GOODBYE 1
    hello 2
    GOODBYE 2
    hello 3
    GOODBYE 3
    list = [result: 2, result: 4, result: 6]
    :ok
    

    或者,您可以这样做:

    defmodule A do
      def go do
        list = Enum.map([1, 2, 3], &my_func/1)
        IO.puts "list = #{inspect list}"
      end
    
      def my_func(x) do
        IO.puts "hello #{x}"
        str = String.upcase("goodbye #{x}")
        spawn(fn -> IO.puts str end)
        {:result, 2*x}
      end
    
    end
    

    在 iex 中:

    iex(5)> A.go
    hello 1
    GOODBYE 1
    hello 2
    GOODBYE 2
    hello 3
    GOODBYE 3
    list = [result: 2, result: 4, result: 6]
    :ok
    

    我可以使用 for 循环,但它不会给我任何结果

    defmodule A do
      def go do
    
        list = for x <- [1, 2, 3] do
          x
          |> IO.inspect()
          |> Kernel.+(10)
          |> IO.inspect(label: "+10")
          |> Kernel.*(3)
          |> IO.inspect(label: "*3")
          |> do_stuff()
        end
    
        IO.puts "list = #{inspect list}"
      end
    
      def do_stuff(x), do: {:result, x * 100}
    end
    

    在 iex 中:

    iex(3)> A.go     
    1
    +10: 11
    *3: 33
    2
    +10: 12
    *3: 36
    3
    +10: 13
    *3: 39
    list = [result: 3300, result: 3600, result: 3900]
    :ok
    

    【讨论】:

    • @VishalG attentions => intentions
    猜你喜欢
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多