2014-02-12 30 views
4

我正在學習使用elixir lang getting started的Elixir編程,並且我堆疊了record brace syntax在Elixir記錄中使用括號語法

這是樣板:

defrecord FileInfo, atime: nil, accesses: 0 
defmodule FileAccess do 
    def was_accessed?(FileInfo[accesses: 0]), do: false 
    def was_accessed?(FileInfo[]),   do: true 
end 

雖然筆者認爲藥劑在編譯時的記錄擴大到一個元組。所以

def was_accessed?(FileInfo[accesses: 0]), do: false 

是一樣的:

def was_accessed?({ FileInfo, _, 0 }), do: false 

但是,當我在藥劑shell中鍵入:

iex(13)> FileInfo[access: 0] == {FileInfo, nil, 0} 
true 
iex(14)> FileInfo[access: 0] == {FileInfo, 0, 2} 
false 

結果竟然FileInfo[access: 0]等於{FileInfo, nil, 0}

不是{ FileInfo, _, 0 }

這兩個場景有什麼不同?

回答

4

很好的問題!

區別在於上下文。在第一個示例中,Elixir知道FileInfo[]正在函數簽名(特別是在匹配上下文中)內被調用,因此,它不是使用默認值,而是將所有非給定值擴展爲_

在另一個例子中,我們不在匹配上下文中,它只是常規上下文。在此背景下,_甚至不是有效的:

iex> _ 
** (CompileError) iex:1: unbound variable _ 

在這種情況下,藥劑擴大非定值默認的。