【问题标题】:"Invalid expression in guard, case is not allowed in guards" error“防护中的表达式无效,防护中不允许大小写”错误
【发布时间】:2018-05-15 11:15:18
【问题描述】:

以下代码被mix视为错误:

case test do
      ...
      t when !is_list(t) -> false
      ...
end

错误是“防护中的表达式无效,防护中不允许大小写”。

但是,如果我删除!,即写

case test do
      ...
      t when is_list(t) -> false
      ...
end

没有报错。

这不可能吧? ! 应该只是否定函数。

【问题讨论】:

  • FWIW,this 明确表示 ! 不允许出现在保护子句中,this 明确表示not 允许出现在保护子句中。

标签: pattern-matching elixir


【解决方案1】:

我认为如果您使用关键字not 而不是!,它会起作用。

Not 允许在警戒测试中使用,! 不允许在警戒测试中使用。

【讨论】:

  • 我明白了。为什么会这样。是否有特殊原因禁止!
  • 我不知道为什么,我只能看到 ! 是一个宏(可以接收任何参数),not 是一个只接受布尔值并且可以通过编译器。
【解决方案2】:

! 不是否定函数,它是一个宏。

查看elixir中的代码,lib/elixir/lib/kernel.ex: 1552

 defmacro !value

  defmacro !{:!, _, [value]} do
    optimize_boolean(
      quote do
        case unquote(value) do
          x when :"Elixir.Kernel".in(x, [false, nil]) -> false
          _ -> true
        end
      end
    )
  end

  defmacro !value do
    optimize_boolean(
      quote do
        case unquote(value) do
          x when :"Elixir.Kernel".in(x, [false, nil]) -> true
          _ -> false
        end
      end
    )
  end

扩展后的! 宏是case statement,这在长生不老药守卫中是不允许的。

而不是erlang函数:

  @spec not true :: false
  @spec not false :: true
  def not value do
    :erlang.not(value)
  end

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    相关资源
    最近更新 更多