Elixir do/end块

2023-12-14 16:47 更新

目前,我们已经学习了四种控制结构:,,和,它们都包含了块。所以我们也能够以如下方式写语句:

casecondifunlessdo/endif
iex> if true, do: 1 + 2
3

注意在和之间有一个逗号,这是因为Elixir中参数之间要以逗号隔开。我们称这种格式为关键字列表。我们也可以用关键字来传递:truedo:else

iex> if false, do: :this, else: :that
:that

do/end块形式是在关键字形式的语法上经过化简所得的。这就是为什么块形式不要求参数与块之间用逗号隔开。它消除了在书写块代码时的冗余信息。下列两种语法作用是相同的:do/end

iex> if true do
...>   a = 1 + 2
...>   a + 10
...> end
13
iex> if true, do: (
...>   a = 1 + 2
...>   a + 10
...> )
13

需要记住的是在使用块时,它们总是和最外层的函数调用捆绑在一起。例如:do/end

iex> is_number if true do
...>  1 + 2
...> end
** (CompileError) undefined function: is_number/2

会被解释成:

iex> is_number(if true) do
...>  1 + 2
...> end
** (CompileError) undefined function: is_number/2

产生错误的原因是Elixir试图调用函数,却得到了两个参数(表达式也会产生错误,因为需要它的第二个参数,也就是块)。添加明确的括号能够消除歧义:is_number/1if trueifdo/end

iex> is_number(if true do
...>  1 + 2
...> end)
true

关键字列表在语言中扮演着重要的角色,在许多函数与宏中都很常见。在之后的章节中我们会继续他;探索它。现在,让我们谈谈"二进制,字符串和字符列表"。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号