在 NaiveDateTime 上尝试 .add/3 时出错

Error when attempting .add/3 on NaiveDateTime

我正在学习 Elixir 并且遇到一个简单(我认为)操作的错误:

    d = NaiveDateTime.from_erl({{year, month, day}, {hours, minutes, seconds}}, {0, 0}, Calendar.ISO)
    NaiveDateTime.add(d, 20, :second)

结果如下:

Attempted function clauses (showing 1 out of 1):

    def add(%{microsecond: {_, precision}, calendar: calendar} = naive_datetime, amount_to_add, unit) when is_integer(amount_to_add)

我的代码与我在其他地方看到的示例相匹配。我不太明白错误语法。我的理解是 %{microsecond.. 是一张地图。为什么会出错?

您几乎做到了:注意您的 return 值!

NaiveDateTime.from_erl/3 return 是一个 元组 ,而不仅仅是一个 NaiveDateTime 结构,所以这就是 NaiveDateTime.add/3 引发 FunctionClauseError.

比较以下 2 个输出:

iex> d = NaiveDateTime.from_erl({{2021, 3, 30}, {10, 17, 0}}, {0, 0}, Calendar.ISO)
{:ok, ~N[2021-03-30 10:17:00]}
iex> d = NaiveDateTime.from_erl!({{2021, 3, 30}, {10, 17, 0}}, {0, 0}, Calendar.ISO)
~N[2021-03-30 10:17:00]

第一个 return 是一个包含 NaiveDateTime 的元组,而第二个 return 仅包含 NaiveDateTime.

简而言之,您可以使用 ! 变体 NaiveDateTime.from_erl!/3,其中 return 是 NaiveDateTime 或在错误时引发,或者您可以匹配值 return 像这样从 NaiveDateTime.from_erl/3 编辑:

iex> {:ok, d} = NaiveDateTime.from_erl({{2021, 3, 30}, {10, 17, 0}}, {0, 0}, Calendar.ISO)
# OR
iex> d = NaiveDateTime.from_erl!({{2021, 3, 30}, {10, 17, 0}}, {0, 0}, Calendar.ISO)
# then you may add:
iex> NaiveDateTime.add(d, 20, :second)
~N[2021-03-30 10:17:20]

函数的“常规”和 ! 变体在 Elixir 中很常见,并且当您只想要值时意外地以元组结尾是很常见的。