Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 如何使用;加上;长生不老药中的关键字和它的用途?_Elixir - Fatal编程技术网

Elixir 如何使用;加上;长生不老药中的关键字和它的用途?

Elixir 如何使用;加上;长生不老药中的关键字和它的用途?,elixir,Elixir,在Elixir1.2中,他们包含了关键字“with”,但我并不完全清楚它的用途 在管道中使用函数时,在Elixir 1.2之前的版本中,您必须使用monad库或nest case语句(可以使用私有函数进行重构,但最终仍然会很冗长)。允许以不同的方式解决此问题 以下是来自以下方面的示例: case File.read(path)do {:好的,二进制}-> case:beam_lib.chunk(二进制,:abstract_代码)do {:好的,数据}-> {:好的,换行(数据)} 错误-> 错误

在Elixir1.2中,他们包含了关键字“with”,但我并不完全清楚它的用途


在管道中使用函数时,在Elixir 1.2之前的版本中,您必须使用monad库或nest case语句(可以使用私有函数进行重构,但最终仍然会很冗长)。允许以不同的方式解决此问题

以下是来自以下方面的示例:

case File.read(path)do
{:好的,二进制}->
case:beam_lib.chunk(二进制,:abstract_代码)do
{:好的,数据}->
{:好的,换行(数据)}
错误->
错误
结束
错误->
错误
结束
以下是经过重构以使用函数的相同内容:

路径
|>File.read()文件
|>读块
|>包裹()
defp read_块({:ok,binary})可以
{:好的,:beam_lib.chunks(二进制,:abstract_code)}
结束
defp read_块(错误),do:error
defp wrap({:ok,data})do
{:好的,换行(数据)}
结束
解除包裹(错误),do:错误
和使用
的相同代码:

使用{:ok,binary}还可以链接“裸表达式”,如文档所述:

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

与{:ok,binary}需要提及的一件事是,您可以在
语句一起使用
保护。 例如

defmoduletestdo
def测试(res)do
使用{:ok,decode_res}何时是_map(decode_res)IO.inspect decode_res
_ ->
IO.inspect“错误”
结束
结束
结束
Test.Test({:ok,nil})
Test.Test({:ok,12})
Test.Test({:ok,%{}})

事实上,“带版本”看起来好多了。这是非常有用的。我认为
defp read_chunks
的主体应该只读取
:beam_lib.chunks(二进制,:abstract_code)
(即,没有首字母
{:ok,
),我觉得ok_jose()看起来更干净(除了名字)。有没有理由不使用该选项?您的示例没有显示如何处理错误。您说with将返回错误,这是否意味着我们应该将with分配给变量,以便在发生错误时进行进一步检查?是否可以显示with语句如何处理错误的示例with语句在出现错误时的结果是错误。您可以指定并检查它,但是如果您使用的是Elixir 1.3,那么您可以使用..else,如中所述
defmodule Test do
  def test(res) do
    with {:ok, decode_res} when is_map(decode_res) <- res
    do
      IO.inspect "ok"
    else
      decode_res when is_map(decode_res) -> IO.inspect decode_res
      _ ->
        IO.inspect "error"
    end
  end
end
Test.test({:ok , nil})
Test.test({:ok , 12})
Test.test({:ok , %{}})