【问题标题】:Using of bracket syntax in Elixir record在 Elixir 记录中使用括号语法
【发布时间】:2014-02-12 20:27:37
【问题描述】:

我正在使用 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 }

这两个场景有什么区别?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    非常好的问题!

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 2022-01-13
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多