Elixir 为什么可以';我不能在长生不老药闭合功能头中使用pin运算符吗?

Elixir 为什么可以';我不能在长生不老药闭合功能头中使用pin运算符吗?,elixir,Elixir,通常在Elixir中,我可以使用pin运算符指定绑定到现有名称的值,即: a = 1 {^a, b} = {1,2} # b is now 2 一切正常 但是,我似乎无法将这样的值固定在闭包函数头中,即: a = 1 f = fn ^a -> true _ -> false end 导致编译失败: **(CompileError)iex:2:未绑定变量^a 这有什么原因吗?有没有正确的方法来达到同样的效果 感谢上述问题的解决方法似乎是在闭包中使用case语句,尽管它感觉不

通常在Elixir中,我可以使用pin运算符指定绑定到现有名称的值,即:

a = 1
{^a, b} = {1,2}
# b is now 2
一切正常

但是,我似乎无法将这样的值固定在闭包函数头中,即:

a = 1
f = fn
  ^a -> true
  _ -> false
end
导致编译失败:
**(CompileError)iex:2:未绑定变量^a

这有什么原因吗?有没有正确的方法来达到同样的效果


感谢

上述问题的解决方法似乎是在闭包中使用case语句,尽管它感觉不必要地复杂

a = 1

f = fn n ->
  case n do
    ^a -> true
    _ -> false
  end
end

f.(1)
# true
f.(2)
# false

虽然这样做有效,但我不能在fn头部直接使用pin运算符,这一点很奇怪。

这直接来自José对另一个问题的回答:

Elixir只允许在同一范围内重新绑定,所有构造(case、cond和receive除外)都引入了一个新范围


因此,您不能固定a,因为它是一个新的作用域

您的代码在概念上没有问题。它不起作用,因为它是当前Elixir版本中的一个限制,将在Elixir v1.2中解决

您可以通过以下方式获得相同的结果:

a = 1
f = fn
  new_a when a === new_a -> true
  _ -> false
end

我早上一定过得很慢,但你能详细解释一下为什么创建一个新的作用域会停止对a的固定吗?毕竟,我并没有明确地对a进行重新绑定,而是在我对a进行固定时将其值解引用到模式中,这是否与我取消引用任何其他闭合覆盖绑定时相同?您试图锁定的值不存在。这是一个新的范围。当你使用用例时,你没有得到一个新的作用域,因此定义了a。我可以在闭包体中使用a的值,不是吗?直接从真理的来源开始!)