5

我正在使用elixir lang 开始学习 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 }

这两个场景有什么区别?

4

1 回答 1

4

非常好的问题!

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

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

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

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

于 2014-02-12T12:27:37.897 回答