【问题标题】:How can I suppress dialyzer warning on comparison between module variable and local static variable?如何在模块变量和局部静态变量之间进行比较时抑制透析器警告?
【发布时间】:2020-01-21 14:03:17
【问题描述】:

Dialyzer 将试图匹配模块变量的代码归咎于:

defmodule Main do
  # -> :demo
  @env Application.get_env(:myproject, :env)

  def run do
    case @env do
      :production -> 1
      _ -> 2
    end
  end
end
lib/myproject/main.ex:6:pattern_match
The pattern can never match the type.

Pattern:
:production

Type:
:demo

我怎样才能避免警告,或者我应该每次都写如下?

  def run do
    env = Application.get_env(:myproject, :env)

    case env do
      ...
    end
  end

【问题讨论】:

    标签: elixir dialyzer


    【解决方案1】:

    我应该每次都写如下吗?

    这取决于您要达到的目标。 dialyzer 很聪明。模块属性是编译时的野兽,它们在编译期间到处被计算和替换。在上面的 sn-p 中进入 BEAM 的内容是:

    defmodule Main do
      def run do
        case :demo do
          :production -> 1
          _ -> 2
        end
      end
    end
    

    也就是说,dialyzer 会针对无法访问的语句向您发出警告,因为它会分析生成的代码,其中包含所有扩展的宏 模块属性。

    如果你想要根据环境不同的编译代码,你有几种方法。

    1. 明确禁止透析器警告为described here
    2. 欺骗透析器(示例可能在 Elixir 核心中找到,我不会在此处粘贴这些示例,因为我发现此解决方案不够强大。)
    3. 直接在case 子句中调用Application.get_env(:myproject, :env)(或按照您的建议分配给局部变量。)

    后一种方法是 IMSO首选

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-08
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2018-04-18
      相关资源
      最近更新 更多