2015-09-07 77 views
3

通常在花好月圓我可以用針操作員指定綁定到現有的名稱即值:爲什麼我不能在Elixir封閉函數頭中使用pin操作符?

a = 1 
{^a, b} = {1,2} 
# b is now 2 

按預期工作。

但是我似乎不能夠引腳值這樣的閉合功能頭,即:

a = 1 
f = fn 
    ^a -> true 
    _ -> false 
end 

導致編譯失敗: ** (CompileError) iex:2: unbound variable ^a

是有原因的這和實現相同結果的正確方法?

感謝

回答

2

你的代碼沒有任何概念錯誤。它不起作用,因爲它是Elixir v1.2上將要解決的當前Elixir版本的限制。

可以實現同樣的結果:

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

直接從事實來源! :) –

0

一種解決上述問題似乎是用瓶蓋內case語句,但它感到費解不必要的。

a = 1 

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

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

雖然這個工作,它突出了這是多麼奇怪的是,我不能在FN頭直接使用針操作。

0

這從一個答案何塞發佈到不同的問題來直:

藥劑允許重新綁定只能在同一個範圍,並且所有結構,結合案例,標準條件的例外和接收,引入新的範圍。

因此,你不能針一個因爲它是一個新的領域。

+0

我一定是一個緩慢的一天了,但你可以解釋爲何一個新的作用域的創建停止的牽制,畢竟,我很明確地不是重新綁定一個,而是將它的值解除引用到模式中,當我的引腳不是I時,這不同於我解引用其他任何封閉綁定? – Foo42

+0

_a_您試圖鎖定的值不存在。這是一個新的範圍。當你使用的情況下,你不會得到一個新的範圍,因此_a_被定義。 –

+0

我可以在封閉體內使用a的值,但不是嗎? – Foo42

相關問題