我想知道,给定算法获得结果的最佳方法是什么?目前的解决方案没有帮助,因为结果 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
答案 0 :(得分:1)
此代码存在几个不同的问题。主要是无法从闭包中访问父上下文(即使在Ruby中也不会更改results
变量:
results = nil
fn(x) -> results = 42 end.()
results
#⇒ nil
警告:变量“
results
”未使用注意
case
,cond
,fn
,if
及类似内容中定义的变量不会泄漏。如果要有条件地覆盖现有变量“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