2014-02-12 2 views
4

Я изучаю программирование Elixir с помощью elixir lang getting started, и я укладываю 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 

Хотя автор считает Elixir расширяет запись в кортеж во время компиляции. так

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

так же, как:

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

Но когда я печатаю в оболочке Elixir:

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 _ 

В этом случае Elixir расширяет не-заданные значения для них по умолчанию.