Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/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 ';案例X do';总是第一个选择_Elixir - Fatal编程技术网

Elixir ';案例X do';总是第一个选择

Elixir ';案例X do';总是第一个选择,elixir,Elixir,我在值列表上循环,在列表中我有一个案例来选择应该返回什么。代码循环代码如下所示: value = code &&& key IO.puts "+++++" IO.puts "key:#{key},code:#{code},code &&& key:#{value},value == key:#{value == key}" case value do key -> IO.puts "value is true" _ -> IO.

我在值列表上循环,在列表中我有一个案例来选择应该返回什么。代码循环代码如下所示:

value = code &&& key
IO.puts "+++++"
IO.puts "key:#{key},code:#{code},code &&& key:#{value},value == key:#{value == key}"
case value do
  key -> IO.puts "value is true"
  _ -> IO.puts "value is false"
end
这些调用的日志输出为:

+++++
key:1,code:1,code &&& key:1,value == key:true
value is true
+++++
key:2,code:1,code &&& key:0,value == key:false
value is true
+++++
key:4,code:1,code &&& key:0,value == key:false
value is true
+++++
key:8,code:1,code &&& key:0,value == key:false
value is true
+++++
key:16,code:1,code &&& key:0,value == key:false
value is true
我总是得到“值为真”,我们可以清楚地看到案例值为假。这里发生了什么


感谢您的帮助。

这正是大小写表达式的工作原理。将
value
的值放入
key
变量中。如果要将
变量的当前值进行匹配,而不是对其进行阴影处理,则需要使用


您正在打印的
值为true
,但事实并非如此。您应该将期望值放在
->
的左侧

one = 1
case one do
  true -> IO.puts("value is true")
  false -> IO.puts("value is false")
end
这将生成:
**(CaseClauseError)没有匹配的case子句:1

使用左侧变量的问题是,变量会反弹到该范围。如果已经存在该名称的变量,则将在case语句中重新绑定该变量:

one = 1
two = 2
case one do
  two -> IO.puts("value matches itself (#{two})")
  _ -> throw("neven happens")
end
这将打印与自身匹配的
值(1)
,因为
one
被分配给
two
,并且始终与自身匹配

如果期望值在变量中,则需要使用pin运算符,正如Justin Wood指出的:

one = 1
two = 2

case one do
  ^two -> IO.puts("value matches the variable in two")
  _ -> IO.puts("#{one} doesn't match #{two}")
此打印的
1与2不匹配

顺便说一句,这种行为的原因是,您可以在左侧进行模式匹配,并捕获变量以便在右侧使用:

map = %{a: "a", b: "b"}

case map do
  %{a: a} -> IO.puts("map's a key contains a value of #{a}")
  _ -> IO.puts("map doesn't contain key a")
end

我应该注意到,这只是因为Elixir允许您重新绑定(与突变不同)变量。如果您在Erlang中执行此操作,它将按照您预期的方式工作,因为Erlang不允许重新绑定,这意味着它没有pin操作符。谢谢。这让我发疯了:)所以如果我理解得很好,这个案例实际上是在尝试将“模式匹配”值转换成键?如果它成功了,那么->被执行了吗?
map = %{a: "a", b: "b"}

case map do
  %{a: a} -> IO.puts("map's a key contains a value of #{a}")
  _ -> IO.puts("map doesn't contain key a")
end