case - Elixir:在 case 语句中使用变量

标签 case constants elixir

我有这个 case 语句,它给出了一个错误“变量 constant1 未使用”。它似乎忽略了变量并返回了第一行,因此变量显然没有范围。如果我用数字 1 替换常量,那么它就可以工作。在 Elixir 中这样做的最佳方法是什么?

defmodule Main 
do
    def constant1, do: 1
    def constant2, do: 1
    def constant3, do: 1

    x = 1
    y = 0
    z = 0

    {a, b, c, d} = 
        case {x, y, z} do
            {constant1, constant2, constant3} -> {1, 2, 3, 4}
            {constant1, constant2, _} -> {5, 6, 7, 8}
            {constant1, _, _} -> {9, 10, 11, 12}
            {_, _, _} -> {13, 14, 15, 16}
        end

    IO.inspect {a, b, c, d}
end

这是输出:
warning: variable constant1 is unused
  Untitled 9:15

{1, 2, 3, 4}

将常量更改为变量也不起作用。

最佳答案

您已定义 constant1作为一个函数。当你尝试在模式匹配中使用它时,Elixir 期望变量在那里并且你得到了一个错误。不能模式匹配功能。

您想要的可能是:

defmodule Main do
    constant1 = 1
    constant2 = 1
    constant3 = 1

    x = 1
    y = 0
    z = 0

    {a, b, c, d} = 
        case {x, y, z} do
            {^constant1, ^constant2, ^constant3} -> {1, 2, 3, 4}
            {^constant1, ^constant2, _} -> {5, 6, 7, 8}
            {^constant1, _, _} -> {9, 10, 11, 12}
            {_, _, _} -> {13, 14, 15, 16}
        end

    IO.inspect {a, b, c, d}
end
#⇒ { 9, 10, 11, 12 }

另外,请记住要模式匹配到已经定义的值,应该使用 the pin operator ^ 在匹配器前面,否则代码
a = 42
case x do
  a -> ...
end

将覆盖 a 的值,将其设置为 x 的值(在 case 块的范围内,在 case 之外的将保留 42 。)与 ^ , 下面的代码将匹配当且仅 x == 42 :
a = 42
case x do
  ^a -> ...
end

关于case - Elixir:在 case 语句中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39589589/

相关文章:

在链接时定义的 C 常量

string - 字符串第一个字符的大小写

java - java.awt.Color.blue 和 java.awt.Color.BLUE 的目的是什么

mysql - SQL:如果使用字符类 [0-9],为什么 LIKE 不起作用?

c++ - 从 "foo<T>"转换为 "const foo<const T>"- C++

postgresql - Travis CI 忽略 Postgres 版本规范

elixir - 字符串/二进制参数末尾的模式匹配

elixir - 检测 Elixir/OTP 主 pipe 生成和终止

mysql - MySQL 中将多个字段合并为一个且具有明确标签

具有一系列值的 MySQL 和 CASE WHEN