Elixir 编程语言入门

已发表: 2022-03-11

如果您一直在阅读博客文章、黑客新闻线程、您最喜欢的开发人员推文或收听播客,那么此时您可能已经听说过 Elixir 编程语言。 该语言由开源世界的知名开发者 Jose Valim 创建。 您可能从 Ruby on Rails MVC 框架或从他和他来自 Plataformatec 的同事在过去几年一直致力于开发的 devise 和 simple_form ruby​​ gems 中认识他。

根据 Jose Valim 的说法,Elixir 诞生于 2011 年。由于缺乏解决 ruby​​ 世界中并发问题的好工具,他萌生了构建新语言的想法。 当时,在花时间研究并发和分布式语言之后,他发现了两种他喜欢的语言,Erlang 和 Clojure,它们运行在 JVM 中。 他喜欢他在 Erlang 语言 (Erlang VM) 中看到的一切,讨厌他没有看到的东西,比如 Clojure 擅长的多态性、元编程和语言可扩展性属性。 因此,Elixir 的诞生就是考虑到这一点,它提供了 Clojure 的替代方案和一种在 Erlang 虚拟机中运行并具有良好可扩展性支持的动态语言。

Elixir 将自己描述为一种动态的、函数式的语言,具有不可变的状态和基于参与者的并发方法,旨在使用简单、现代和整洁的语法构建可扩展和可维护的应用程序。 该语言在 Erlang 虚拟机中运行,这是一种久经考验的高性能分布式虚拟机,以其低延迟和容错特性而闻名。

在我们看到一些代码之前,值得一提的是,Elixir 已经被不断发展的社区所接受。 如果你今天想学习 Elixir,你会很容易地找到书籍、图书馆、会议、聚会、播客、博客文章、时事通讯和各种学习资源,并且它被 Erlang 的创建者所接受。

让我们看一些代码!

安装 Elixir:

在所有主要平台上安装 Elixir 都非常容易,并且在大多数平台上都是单行的。

Arch Linux

Elixir 可通过官方存储库在 Arch Linux 上获得:

 pacman -S elixir

Ubuntu

在 Ubuntu 中安装 Elixir 有点繁琐。 但这仍然很容易。

 wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb apt-get update apt-get install esl-erlang apt-get install elixir

操作系统

使用 Homebrew 在 OS X 中安装 Elixir。

 brew install elixir

认识IEx

安装完成后,是时候打开你的shell了。 如果您想在 Elixir 中进行开发,您将在 shell 中花费大量时间。

Elixir 的交互式 shell 或 IEx 是一个 REPL -(阅读评估打印循环),您可以在其中探索 Elixir。 您可以在那里输入表达式,它们将被评估并为您提供即时反馈。 请记住,您的代码是真正经过评估而不是编译的,因此请确保不要在 shell 中运行分析或基准测试。

IEx REPL 演示。

中断命令

在启动 IEx REPL 之前,您需要了解一件重要的事情 - 如何退出它。

您可能习惯于按CTRL+C来关闭终端中运行的程序。 如果您在 IEx REPL 中按CTRL+C ,您将打开中断菜单。 进入中断菜单后,您可以再次按CTRL+C退出 shell 以及a .

退出 IEx REPL。

我不打算深入研究中断菜单功能。 但是,让我们看看一些 IEx 助手!

帮手

IEx 提供了一堆助手,以便列出所有这些类型: h()

这是你应该看到的:

IEx 助手。

这些是我最喜欢的一些,我想它们也会是你的。

  • h正如我们刚刚看到的,此函数将打印帮助消息。
  • h/1是同一个函数,但现在它需要一个参数。

例如,每当您想查看String strip/2方法的文档时,您都可以轻松地执行以下操作:

IEx:检查文档。

在 Elixir 中编程时,您将使用的第二个最有用的 IEx 助手可能是c/2 ,它编译给定的 elixir 文件(或列表),并期望将编译文件写入的路径作为第二个参数。

假设您正在参与其中一项 http://exercism.io/ Elixir 练习,即 Anagram 练习。

因此,您已经实现了Anagram模块,该模块在 anagram.exs 文件中有方法match/2 。 作为优秀的开发人员,您已经编写了一些规范以确保一切都按预期工作。

这是您当前目录的外观:

此 Elixir 项目的目录列表。

现在,为了针对 Anagram 模块运行测试,您需要运行/编译测试。

在 Elixir 中运行测试。

如您所见,为了编译文件,只需调用作为参数路径传递给您要编译的文件的elixir可执行文件。

现在假设您要运行 IEx REPL,并在会话上下文中访问 Anagram 模块。 有两个常用的选项。 第一个是您可以使用选项-r来获取文件,例如iex -r anagram.exs 。 第二个,您可以直接从 IEx 会话编译。

直接从 IEx 会话编译。

很简单,就是这样!

好的,如果你想重新编译一个模块呢? 您是否应该退出 IEx,再次运行它并再次编译文件? 没有! 如果你记忆力好,你会记得当我们列出 IEx REPL 中所有可用的帮助器时,我们看到了一些关于重新编译命令的东西。 让我们看看它是如何工作的。

在IEx中重新编译。

请注意,这一次,您将模块本身而不是文件路径作为参数传递。

正如我们所看到的,IEx 有许多其他有用的助手,可以帮助您更好地学习和理解 Elixir 程序的工作原理。

Elixir 类型的基础知识

数字

有两种类型的数字。 任意大小的整数和浮点数。

整数

整数可以写成十进制、十六进制、八进制和二进制。

与在 Ruby 中一样,您可以在编写大数字时使用下划线来分隔三位数组。 例如,您可以像这样纠正一亿:

 100_000_000

八进制:

 0o444

十六进制:

 0xabc

二进制:

 0b1011

花车

Floare 是 IEEE 754 双精度。 它们具有 16 位精度,最大指数约为 10308。

浮点数使用小数点写入。 点前后必须至少有一位数字。 您还可以附加一个尾随指数。 例如 1.0、0.3141589e1 和 314159.0-e。

原子

原子是表示名称的常量。 它们是不可变的值。 你写一个原子,其前导冒号:和一系列字母、数字、下划线和 at 符号@ 。 您还可以使用前导冒号:和用引号括起来的任意字符序列来编写它们。

原子是一个非常强大的工具,它们用于引用 erlang 函数以及键和 Elixir 方法。

这里有一些有效的原子。

 :name, :first_name, :"last name", :===, :is_it_@_question?

布尔值

当然,布尔值是真值和假值。 但它们的好处是归根结底,它们只是原子。

正如 IEx 所证明的,布尔值只是原子。

字符串

默认情况下,Elixir 中的字符串是 UTF-8 兼容的。 要使用它们,您可以使用"'括起来的任意数量的字符。您还可以在字符串中使用插值表达式以及转义字符。

Elixir 字符串插值。

请注意,单引号字符串实际上是二进制文件列表。

Elixir 中的单引号字符串行为。

匿名函数

作为一种函数式语言,Elixir 具有匿名函数作为基本类型。 编写函数的一种简单方法是fn (argument_list) -> body end 。 但是一个函数可以有多个具有多个参数列表、保护子句等的主体。

Dave Thomas 在 Programming Elixir 书中建议我们将 fn...end 视为围绕字符串文字的引号,在此我们不是返回字符串值,而是返回一个函数。

返回一个 Elixir 函数。

元组

元组是一个不可变的索引数组。 由于其不可变的性质,它们返回其大小的速度很快,而附加新值的速度很慢。 更新元组时,您实际上是在创建元组自身的全新副本。

元组经常被用作数组的返回值。 在 Elixir 中编码时,您会经常看到{:ok, something_else_here}

下面是我们如何编写一个元组: {?a,?b,?c}

模式匹配

我无法解释您需要了解的有关模式匹配的所有内容,但是您将要阅读的内容涵盖了您入门时需要了解的很多内容。

Elixir 使用=作为匹配运算符。 为了理解这一点,我们需要忘掉我们所知道的=在其他传统语言中的知识。 在传统语言中,等号运算符用于赋值。 在 Elixir 中,等号运算符用于模式匹配。

所以,这就是它在左侧工作值的方式。 如果它们是变量,它们将绑定到右侧,如果它们不是变量,elixir 会尝试将它们与右侧匹配。

Elixir 模式匹配演示。

引脚运算符

Elixir 提供了一种始终强制模式匹配左侧变量的方法,即 pin 运算符。

Elixir pin 操作员演示。

列表

在 Elixir 中,列表看起来像我们从其他语言中知道的数组,但它们不是。 列表是由头部和尾部组成的链接结构。

Elixir 列表行为。

关键字列表

关键字列表是元组对的列表。

您只需将它们写为列表。 例如:[{:one, 1}, 2, {:three, 3}]。 定义列表有一个快捷方式,如下所示:[一:1,三:3]。

为了从关键字列表中检索项目,您可以使用:

 Keyword.get([{:one, 1}, 2, {:three, 3}], :one)

或者使用快捷方式:

 [{:one, 1}, 2, {:three, 3}][:one]

因为关键字列表在检索值时很慢,这是一项昂贵的操作,因此如果您要存储需要快速访问的数据,您应该使用 Map。

地图

映射是键/值对的有效集合。 键可以具有您想要的任何值作为键,但通常应该是相同的类型。 与关键字列表不同,地图只允许一个给定键的条目。 它们随着增长而变得高效,并且当您需要关联数组时,它们可以用于通用地图中的 Elixir 模式匹配。

以下是编写 Map 的方法:

 %{ :one => 1, :two => 2, 3 => 3, "four" => 4, [] => %{}, {} => [k: :v]}

结论

Elixir 很棒,易于理解,具有简单但功能强大的类型以及非常有用的工具,这将在您开始学习时为您提供帮助。 在第一部分中,我们介绍了 Elixir 程序所基于的各种数据类型以及为它们提供支持的运算符。 在后面的部分中,我们将深入了解 Elixir 的世界——函数式和并发编程。

相关:发掘用于前端开发的 ClojureScript