我正在使用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 }
。
这两个场景的区别是什么?
答案 0 :(得分:4)
非常好的问题!
区别在于背景。在第一个示例中,Elixir知道函数签名内部正在调用FileInfo[]
(特别是在匹配上下文中),因此,它不是使用默认值,而是将所有非给定值扩展为{{1 }}
在另一个例子中,我们不在匹配上下文中,它只是常规上下文。在这种情况下,_
甚至无效:
_
在这种情况下,Elixir将非给定值扩展为默认值。