Elixir从匿名函数推送到数组的最佳方法是什么?

时间:2018-03-10 16:31:57

标签: elixir phoenix-framework

我想知道,给定算法获得结果的最佳方法是什么?目前的解决方案没有帮助,因为结果 nil 。如何在 iterate_json 中访问变量结果而不将其作为参数传递?

def lookup(json) do
    results = []
    iterate_json(json, fn(x) -> 
        if x["title"] =~ "sunt" do
            results = [x|results]
        end
    end)
    results
end

def iterate_json([head|tail],f) do
    f.(head)
    iterate_json(tail,f)
end

def iterate_json([],f), do: nil

1 个答案:

答案 0 :(得分:1)

此代码存在几个不同的问题。主要是无法从闭包中访问父上下文(即使在Ruby中也不会更改results变量:

results = nil
fn(x) -> results = 42 end.()
results
#⇒ nil
  

警告:变量“results”未使用

     

注意casecondfnif及类似内容中定义的变量不会泄漏。如果要有条件地覆盖现有变量“results”,则必须显式返回变量。例如:

以上是iex在尝试执行此代码时吐出的内容。

  

如何在results中访问变量iterate_json而不将其作为参数传递?

可以在iterate_json中访问。预先设置的值将被捕获并在闭包中使用。你不能做的是,你无法从封闭内部改变它。

您要实现的目标实际上是Enum.reduce/3操作:

def lookup(json) do
  Enum.reduce(json, [], fn x, acc ->
    if x["title"] =~ "sunt", do: [x|acc], else: acc
  end)
end