元组是在内存中连续存储的集合,允许通过索引快速访问其元素。Elixir的元组常用作函数返回结果和进程消息,用来传递包含值的信号。例如,可以用元组表示函数的结果是成功还是失败。下面的例子用第一个元素(原子)表示成功,用第二个元素(值)表示计算结果。
图3-1是元组的存储示意图:
图3-1 元组的存储示意图
我们可以将元素存储在元组中,然后用简单的表达式将它们绑定到变量。
为了让表达式两侧匹配,Elixir绑定了多个变量。现在变量a、b、c拥有元组中元素的值。这又是一次解构,从元组中提取值并将它们绑定到变量。
元组还可以用作函数返回值,用来表示成功或失败。我们创建一个返回元组的函数,其中第一项是:ok,表示成功。然后使用模式匹配,仅当结果成功时才让程序继续运行。请尝试以下代码:
函数process_life_the_universe_and_everything返回一个元组。第一个元素用原子:ok表示成功,第二个元素是计算值。我们用{:ok,answer}模式匹配它。该模式是一个元组,如果第一项是:ok,第二项将绑定到变量answer。最后打印answer的值。
采用这种方式,我们就能匹配比数字和字符串更复杂的结构了。
函数返回的可能不是元组
当返回值指示错误或成功时,Elixir函数的行为可能不一致。例如,有些函数为不成功的结果返回一个原子,而为成功的结果返回一个元组。这取决于函数作者的风格。在使用函数之前最好查一下文档。最合适的做法是返回{:ok,value}表示成功,返回{:error,:error_type}表示失败。
接下来,我们用Integer.parse/1创建一个示例,展示元组的另一种用法。我们将构建一个脚本,帮助角色扮演游戏(RPG)的玩家计算角色的属性值。角色扮演游戏允许玩家创建和扮演角色。我们的脚本可以帮助他们。
玩家输入角色属性值,程序显示修正值。如果你从未玩过RPG,请不要担心。这个示例最重要的部分是检验用户输入的数字是否有效,只有在有效的情况下才进行计算。用户输入的内容是很难预测的,例如,有人可能输入热狗(hot dogs),这时我们的程序会因错误而停止。我们希望确保程序只使用有效数字进行计算。让我们创建一个名为ability_modifier.exs的Elixir脚本文件。
以扩展名.exs结尾的文件是不需编译的Elixir脚本文件。{ability_score,_}表达式中的通配符_可以匹配所有内容。它用于忽略匹配表达式的某些部分。
我们用IO.gets/1函数获取用户输入。用户需要按Enter键才能完成输入。我们可以使用elixir ability_modifier.exs命令运行此脚本并与之交互:(www.xing528.com)
你可以再次执行脚本并输入hot dogs,那将引发错误。
现在让我们看看脚本第二行的元组模式。Integer.parse/1函数成功解析之后返回一个元组。第一个元素是解析出的整数值,第二个元素是无法解析的剩余文本。如果从输入内容中无法解析出整数,该函数不返回元组,而是返回一个原子:error。
请注意,这里是用元组(而不是原子)表示成功结果的。我们使用模式匹配表达式{ability_score,_}检查结果是否为元组——是否解析成功。此表达式还将第一个元素绑定到变量ability_score,并用通配符忽略其余文本。用这个方法可以提取部分值进行匹配。
三种等号运算符
Elixir有三种等号运算符。=用于模式匹配。==用于判断值是否相等,相等则返回true。===不但要判断值是否相等,还要判断是否是相同的类型,都满足才返回true。这里有几个例子:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。