Elixir v1.12发布了,它改进了脚本、更紧密的Erlang/OTP 24集成、阶梯式范围,以及标准库中的十几个新函数。总的来说,这是一个小版本,它延续了我们每6个月为Elixir开发者带来生活质量改进的传统。其中一些改进与最近将数值计算引入Elixir的努力直接相关。
Elixir v1.12需要Erlang/OTP 22+。我们也建议在安装后运行mix local.rebar
,升级到最新的Rebar版本,其中包括对Erlang OTP/24+的支持。
注意:本公告包含asciinema片段。你可能需要在这个网站上启用第三方的JavaScript,以便看到它们。如果JavaScript被禁用,noscript
标签与适当的链接将被显示。
脚本改进:Mix.install/2
和System.trap_signal/3
Elixir v1.12为使用Elixir进行脚本编写的用户带来了新的便利(通过.exs
文件)。Elixir能够管理依赖关系已经有相当长的时间了,但它只能在Mix项目中完成。特别是,Elixir团队对全局依赖很谨慎,因为任何依赖系统包的脚本都是很脆弱的,并且在你的系统发生变化时很难重现。
Mix.install/2
,旨在成为单文件脚本和完整的Mix项目之间的一个甜蜜点。使用Mix.install/2
,你可以在脚本的顶部列出你的依赖项。当你第一次执行脚本时,Elixir会在运行你的脚本之前下载、编译和缓存你的依赖项。脚本的未来调用将简单地从缓存中读取编译后的工件。
Mix.install([:jason])
IO.puts(Jason.encode!(%{hello: :world}))
复制代码
Mix.install/2
也会进行协议整合,这为脚本开发者提供了一个选择,即以最有效的格式执行他们的代码。注意Mix.install/2
目前是实验性的,它可能在未来的版本中发生变化。
此外,Mix.install/2
与Livebook搭配得很好,Livebook是一个新宣布的项目,为Elixir带来了互动和协作的笔记本项目。通过Livebook和Mix.install/2
,你可以将依赖关系带入你的代码笔记本,并确保它们是完全可重复的。观看Livebook公告以了解更多。
脚本的另一个改进是能够通过System.trap_signal/3
捕获退出信号。你所需要的只是信号名称和信号触发时将被调用的回调。例如,ExUnit利用这个功能,当你通过SIGQUIT (Ctrl+\\
)中止测试套件时,打印所有当前运行的测试。你可以在下面的Plug项目中运行测试时看到这个功能的作用。
当你的测试卡住了,你想知道哪一个是罪魁祸首时,这特别有用。
重要提示: 捕获信号可能会对系统的关闭和生产中的行为产生很大的影响,因此非常不鼓励库设置自己的陷阱。相反,他们应该让用户自己去配置它们。唯一可以接受库设置自己的陷阱的情况是在脚本模式下使用Elixir,例如在.exs
文件和通过Mix任务。
更紧密的Erlang/OTP 24整合
Erlang/OTP 24带有JIT编译功能,Elixir开发者不需要做任何事情就可以获得它的好处。在Erlang/OTP 24中还有许多其他值得期待的功能,Elixir v1.12提供了与其中许多功能的集成:如对位串中16位浮点的支持,以及在编译器和代码评估期间的性能改进。
Erlang/OTP 24的另一个优秀特性是EEP 54的实现,它为Erlang的stdlib中的许多函数提供了扩展错误信息。Elixir v1.12完全利用了这一特性,改善了对来自Erlang的错误的报告。例如,在早期的OTP版本中,将一个无效的参数插入一个不再存在的ETS表,只会出错,ArgumentError
。
然而,在Elixir v1.12与Erlang/OTP 24中。
最后,注意Rebar v2不再适用于Erlang/OTP 24+。从Elixir v1.4开始,Mix默认为Rebar v3,所以绝大部分开发者不需要做任何改变。然而,如果你在你的依赖中明确设置了manager: :rebar
,你要通过删除:manager
选项来转移到Rebar v3。与不支持的Rebar版本的兼容性将在未来从Mix中删除。
阶梯式范围
Elixir在其v1.0版本之前就有对范围的支持。范围只支持整数,并且是包容性的,使用数学符号a..b
。Elixir中的范围要么是增加的1..10
,要么是减少的10..1
,范围的方向总是从第一个和最后一个位置推断出来的。范围总是懒惰的,因为它的值是在被枚举时发出的,而不是预先计算出来的。
不幸的是,由于这种推断,不可能有空的范围。例如,如果你想创建一个n
元素的列表,你不能用从1..n
的范围来表达,因为1..0
(对于n=0
)是一个有两个元素的递减范围。
Elixir v1.12通过 first..last//step
符号支持阶梯式范围。例如:1..10//2
将发出数字1
,3
,5
,7
, 和9
。你可以把//
运算符看作等同于 “范围除法”,因为它有效地将范围内的元素数除以step
,在不精确的情况下进行舍入。台阶可以是正的(增加范围)或负的(减少范围)。阶梯范围为Elixir范围带来了更多的表达能力,它们优雅地解决了空范围的问题,因为它们允许明确地声明阶梯的方向,而不是推断的。
从Elixir v1.12开始,隐式递减范围已被软弃用,在未来的Elixir版本中会根据我们的弃用政策发出警告。
then/2
和tap/2
在Kernel
模块中增加了两个新的函数,以方便使用管道工作。 tap/2
将给定的参数传递给一个匿名函数,返回参数本身。 then/2
将给定的参数传递给一个匿名函数,返回结果。下面的内容。
"hello world"
|> tap(&IO.puts/1)
|> then(&Regex.scan(~r/\w+/, &1))
复制代码
相当于这个。
"hello world"
|> (fn x ->
IO.puts(x)
x
end).()
|> (&Regex.scan(~r/\w+/, &1)).()
复制代码
tap/2
和then/2
都是作为宏来实现的,Erlang/OTP 24上的编译器改进确保中间的匿名函数被优化掉了,这保证了上述的成语不会对你的代码产生任何性能影响。
IEx的改进
IEx在这个版本中得到了两个重要的生活质量改进。在一个函数调用后点击tab会显示该函数的所有参数,现在可以在shell中粘贴带有管道的代码。请看下面这两个功能的应用。
附加功能
Elixir v1.12还在标准库中增加了许多功能。Enum
模块收到了新增的功能,如Enum.count_until/2
,Enum.product/1
,Enum.zip_with/2
, 等等。Integer
模块现在包括Integer.pow/2
和Integer.extended_gcd/2
。
Code
模块得到了一个 cursor_context/2
函数,它现在被用来支持IEx
自动完成,它被Livebook等项目用来提供智能提示。
EEx应用程序也得到了扩展,以提供文本段的元数据。这使得Surface和Phoenix LiveView团队能够实现一种叫做HEEx的新模板语言,它可以验证HTML和EEX。最后,Registry
模块支持:compressed
选项,这对通过Absinthe管理数十万订阅的GraphQL应用很有用。
关于所有变化的完整列表,请看完整的发布说明。查看安装部分以获得Elixir的安装,并阅读我们的入门指南以了解更多。
祝你玩得开心!
© 2012-2021 Elixir团队。保留所有权利。