elixir与管道运算符的多个参数

时间:2016-04-19 21:49:23

标签: elixir

我试图加载一个非常大的JSON文件并将其绑定到一个变量,这是我的代码失败.....

deps = File.open("../DepMap.json")
    |> IO.read(:all) 
    |> JSX.decode

我回来了

** (FunctionClauseError) no function clause matching in :io.request/2
(stdlib) io.erl:556: :io.request({:error, :enoent}, {:get_line, :unicode, ""})
(elixir) lib/io.ex:82: IO.do_read_all/2
lib/depchecker.ex:6: (module)
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6

我在这里缺少什么?我假设File.open的结果作为第一个争论传递给IO.read(:all),但这是失败的重点,我不知道如何纠正这个问题。

1 个答案:

答案 0 :(得分:4)

File.open会返回{:ok, pid}{:error, reason}。第二个是失败的情况。在这里你得到{:error, :enoent}意味着文件不存在 - 你可能需要弄清楚你的路径有什么问题。

您可能还想在管道中使用爆炸版File.open

deps = File.open!("../DepMap.json")
|> IO.read(:all) 
|> JSX.decode

此行为与File.open类似,但会引发异常而不是返回错误值。成功虽然它只返回代表文件的pid,这就是IO.read调用所需的内容。