Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 如何在比较模块变量和局部静态变量时抑制透析器警告?_Elixir_Dialyzer - Fatal编程技术网

Elixir 如何在比较模块变量和局部静态变量时抑制透析器警告?

Elixir 如何在比较模块变量和局部静态变量时抑制透析器警告?,elixir,dialyzer,Elixir,Dialyzer,透析器指责代码试图与模块变量匹配: defmodule Main do # -> :demo @env Application.get_env(:myproject, :env) def run do case @env do :production -> 1 _ -> 2 end end end 我该如何避免警告,还是每次都要写下面的内容 def run do env = Application.get_

透析器指责代码试图与模块变量匹配:

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

  def run do
    case @env do
      :production -> 1
      _ -> 2
    end
  end
end
我该如何避免警告,还是每次都要写下面的内容

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

    case env do
      ...
    end
  end
我应该每次都这样写吗

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

    case env do
      ...
    end
  end
这取决于你想要实现什么<代码>透析器是智能的。模块属性是编译时的野兽,它们在编译时被计算和替换。在上面的代码段中,BEAM的作用是:

defmodule Main do
def run do
案例:演示
:生产->1
_ -> 2
结束
结束
结束
这就是说,
dialyzer
会警告您出现无法访问的语句,因为它会分析生成的代码,所有宏都已展开,模块属性已插入

如果您希望根据环境使用不同的编译代码,可以使用几种方法

  • 根据需要明确抑制透析器警告
  • 欺骗透析器(例子可能在Elixir core中找到,我不会在这里粘贴这些,因为我觉得这个解决方案不够健壮。)
  • 调用
    Application.get_env(:myproject,:env)
    直接在
    case
    子句中(或根据建议分配给局部变量)
  • 后一种方法是我不喜欢的