当前位置:  开发笔记 > 前端 > 正文

如何在Elixir中使用"with"关键字,它的用途是什么?

如何解决《如何在Elixir中使用"with"关键字,它的用途是什么?》经验,为你挑选了2个好方法。

在elixir 1.2中,他们已经包含了关键字"with",但它并不完全清楚它是什么.

我将如何以及在何种情况下使用它?



1> Gazler..:

在1.2之前的Elixir版本中,当在管道中使用函数时,您将不得不使用monad库或嵌套case语句(可以使用私有函数重构,但最终仍然是冗长的).with/1允许以不同的方式来解决这个问题.

以下是原始提案中的示例:

case File.read(path) do
  {:ok, binary} ->
    case :beam_lib.chunks(binary, :abstract_code) do
      {:ok, data} ->
        {:ok, wrap(data)}
      error ->
        error
    end
  error ->
    error
end

以下是使用函数重构的相同内容:

path
|> File.read()
|> read_chunks()
|> wrap()

defp read_chunks({:ok, binary}) do
  {:ok, :beam_lib.chunks(binary, :abstract_code)}
end
defp read_chunks(error), do: error

defp wrap({:ok, data}) do
  {:ok, wrap(data)}
end
defp wrap(error), do: error

使用相同的代码with:

with {:ok, binary} <- File.read(path),
     {:ok, data} <- :beam_lib.chunks(binary, :abstract_code),
     do: {:ok, wrap(data)}

这是有效的,因为with只有当值与左侧的模式匹配时才会保持链接.如果不是,则中止链并返回第一个不匹配的结果.例如,如果文件不存在则File.read(path)返回{:error, :enoent}- 这不匹配,{:ok, binary}因此with/1调用将返回{:error, :enoent}.

值得注意的是,与可以用任何方式来使用,而不仅仅是{:ok, foo}{:error, reason}(虽然它是一个很常见的情况).


事实上,"与版本"看起来好多了.这非常有用.
如果存在错误,则with的结果是错误。您可以进行分配和检查,但是,如果您使用的是Elixir 1.3,则可以与http://elixir-lang.org/docs/v1.3/elixir/Kernel.SpecialForms.html中介绍的..else一起使用。 #with / 1

2> 小智..:

您还可以链接"裸表达式",正如文档所说:

with {:ok, binary} <- File.read(path),
     header = parse_header(binary),
     {:ok, data} <- :beam_lib.chunks(header, :abstract_code),
     do: {:ok, wrap(data)}

该变量header仅在with语句中可用.更多信息,请访问https://gist.github.com/josevalim/8130b19eb62706e1ab37

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