我有这个 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/