gpt4 book ai didi

elixir - 该子句无法匹配,因为前一个子句始终匹配

转载 作者:行者123 更新时间:2023-12-02 07:03:28 25 4
gpt4 key购买 nike

不知道为什么我会收到此编译器警告。我在这里做错了什么?

defmodule T do
def get_length do
with {:ok, file} <- File.read("<file>"),
content <- String.downcase(file) do
IO.puts content
end
end
end

警告:此子句无法匹配,因为第 4 行的前一个子句始终匹配

最佳答案

TLDR:with 在这里太过分了。

defmodule T do
def get_length do
{:ok, file} = File.read("<file>")
IO.puts String.downcase(file)
end
end

此外,您还会收到编译器警告,因为 content 将有效匹配 String.downcase/1 提供的任何内容。

详细模式:

我认为您不理解with的意图。 with 是一个糖,用于通过描述您关心的快乐路径上的模式匹配来将许多粗糙嵌套的情况链接在一起。

所以不必写这样令人发指的东西......

defp serve(socket) do
msg =
case read_line(socket) do
{:ok, data} ->
case KVServer.Command.parse(data) do
{:ok, command} ->
KVServer.Command.run(command)
{:error, _} = err ->
err
end
{:error, _} = err ->
err
end

write_line(socket, msg)
serve(socket)
end

...你可以写出这个可爱的魔法:

defp serve(socket) do
msg =
with {:ok, data} <- read_line(socket),
{:ok, command} <- KVServer.Command.parse(data),
do: KVServer.Command.run(command)

write_line(socket, msg)
serve(socket)
end

为了好玩,让我们假设一个情况,在给定的文件示例中我们可以使用 with

想象一下这里定义的函数有相当复杂的失败案例

defmodule X do
def extract_header(file) do
# returns {:ok, file} or {:err, file} or whatever
end

def starts_with_emoji?(file) do
# returns true or false
end
end

您可以看到 with 如何派上用场:

defmodule T do
def header_emoji_alert do
with {:ok, file} <- File.read("<file>"),
{:ok, header} <- X.extract_header(file),
true <- X.starts_with_emoji?(header), do: IO.puts("EMOJI!!!!")
end
end

关于elixir - 该子句无法匹配,因为前一个子句始终匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36606175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com