查看源代码 可选语法表
在本指南中,我们了解到 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
现在让我们逐一移除这些便利性
do
-end
代码块等同于关键字if variable?, do: Call.this(), else: Call.that()
作为最后一个参数的关键字列表不需要方括号,但让我们加上它们
if variable?, [do: Call.this(), else: Call.that()]
关键字列表与包含两个元素元组的列表相同
if variable?, [{:do, Call.this()}, {:else, Call.that()}]
最后,函数调用中的括号是可选的,但让我们加上它们
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
将始终在函数调用中添加括号,除非明确配置为不这样做。这有助于在组织内和更广泛的社区中的所有代码库之间保持一致性。