向后移植Sigils并使其与变量一起使用

时间:2019-03-06 18:12:32

标签: elixir sigils

所以我只是从Elixir开始,看到当前的master添加了对~U[2015-01-13 13:00:07Z]标记的支持,以创建/解析UTC日期。

代码如下:

defmodule MySigils do
  defmacro sigil_U(datetime_string, modifiers)

  defmacro sigil_U({:<<>>, _, [string]}, []) do
    Macro.escape(datetime_from_utc_iso8601!(string))
  end

  defp datetime_from_utc_iso8601!(string) do
    case DateTime.from_iso8601(string) do
      {:ok, utc_datetime, 0} ->
        utc_datetime

      {:ok, _datetime, _offset} ->
        raise ArgumentError,
              "cannot parse #{inspect(string)} as UTC datetime, reason: :non_utc_offset"

      {:error, reason} ->
        raise ArgumentError,
              "cannot parse #{inspect(string)} as UTC datetime, reason: #{inspect(reason)}"
    end
  end
end

在我的代码中,我试图将其与变量timestamp一起使用

timestamp = Map.get(item, "timestamp")
~U[timestamp]
** (ArgumentError) cannot parse "timestamp" as UTC datetime, reason: :invalid_format

但是timestamp被解释为原样,而不是先前的匹配。

有没有办法使它起作用?我需要报价/取消报价吗?除了直接使用DateTime.from_iso8601/1

1 个答案:

答案 0 :(得分:1)

标记符之间的所有内容均以字符串形式发送。因此,sessions变量作为字符串SELECT s.*, ip.country FROM sessions s JOIN ip2country ip ON s.ip_addr BETWEEN ip.from_ip AND ip.to_ip 发送到SELECT * FROM ip2country WHERE from_ip >= 387703808 LIMIT 1 。有一些信号允许插值,按惯例小写。例如~r~R

timestamp

但是在这种情况下,没有定义sigil_U的小写版本,因此您无法插值"timestamp"