我正在学习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 }
。
这两个场景有什么区别?
很好的问题!
不同之处在于上下文。在第一个示例中,Elixir知道FileInfo[]
在函数签名内(特别是在match上下文内)被调用,因此,它不使用默认值,而是将所有非给定值扩展为_
。
在另一个示例中,我们不在匹配上下文中,而只是常规上下文。在这种情况下,_
甚至是无效的:
iex> _
** (CompileError) iex:1: unbound variable _
在这种情况下,Elixir会将非给定值扩展为默认值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句