查看源代码 可选语法表

在本指南中,我们了解到 Elixir 语法允许开发者在某些情况下省略分隔符以使代码更易读。例如,我们了解到括号是可选的

iex> length([1, 2, 3]) == length [1, 2, 3]
true

以及 do-end 代码块等同于关键字列表

# do-end blocks
iex> if true do
...>   :this
...> else
...>   :that
...> end
:this

# keyword lists
iex> if true, do: :this, else: :that
:this

关键字列表使用 Elixir 的常规符号来分隔参数,其中我们将每个键值对用逗号分隔,每个键后跟 :。在 do 代码块中,我们去掉了冒号、逗号,并用换行符分隔每个关键字。它们之所以有用,正是因为它们在编写代码块时消除了冗长性。大多数情况下,我们使用代码块语法,但了解它们是等效的仍然很重要。

这些便利性,我们在这里称为“可选语法”,使语言语法核心保持精简,同时又不牺牲代码的可读性和表达能力。在本章简短的介绍中,我们将使用一小段代码作为练习场来回顾语言提供的四条规则。

逐步演示

以以下代码为例

if variable? do
  Call.this()
else
  Call.that()
end

现在让我们逐一移除这些便利性

  1. do-end 代码块等同于关键字

    if variable?, do: Call.this(), else: Call.that()
  2. 作为最后一个参数的关键字列表不需要方括号,但让我们加上它们

    if variable?, [do: Call.this(), else: Call.that()]
  3. 关键字列表与包含两个元素元组的列表相同

    if variable?, [{:do, Call.this()}, {:else, Call.that()}]
  4. 最后,函数调用中的括号是可选的,但让我们加上它们

    if(variable?, [{:do, Call.this()}, {:else, Call.that()}])

就是这样!这四条规则概述了 Elixir 中可用的可选语法。

为了理解这些规则为何重要,我们可以简要地将 Elixir 与许多其他编程语言进行比较。大多数编程语言都有多个关键字用于定义方法、函数、条件语句、循环等等。每个关键字都有与其相关的语法规则。

然而,在 Elixir 中,这些语言特性都不需要特殊的“关键字”,而是全部建立在这套简单的规则之上。另一个好处是,开发人员还可以以一种与语言本身一致的方式扩展语言,因为用于设计和扩展语言的结构是相同的。我们将在 “元编程”指南 中进一步探讨这个主题。

最终,这些规则使我们能够编写

defmodule Math do
  def add(a, b) do
    a + b
  end
end

而不是

defmodule(Math, [
  {:do, def(add(a, b), [{:do, a + b}])}
])

无论何时有任何问题,这个简短的逐步演示都能帮助你解决。

最后,如果你担心何时应用这些规则,值得注意的是 Elixir 格式化程序会为你处理这些问题。大多数 Elixir 开发人员使用 mix format 任务根据 Elixir 团队和社区定义的一组明确规则来格式化他们的代码库。例如,mix format 将始终在函数调用中添加括号,除非明确配置为不这样做。这有助于在组织内和更广泛的社区中的所有代码库之间保持一致性。