在Elixir记录中使用括号语法

时间:2014-02-12 09:12:12

标签: elixir

我正在使用elixir lang getting started 学习Elixir编程,而且我已经堆叠了record brace syntax

这是样本:

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 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 }

这两个场景的区别是什么?

1 个答案:

答案 0 :(得分:4)

非常好的问题!

区别在于背景。在第一个示例中,Elixir知道函数签名内部正在调用FileInfo[](特别是在匹配上下文中),因此,它不是使用默认值,而是将所有非给定值扩展为{{1 }}

在另一个例子中,我们不在匹配上下文中,它只是常规上下文。在这种情况下,_甚至无效:

_

在这种情况下,Elixir将非给定值扩展为默认值。