Elixir v1.12发布,改进了脚本、更紧密的Erlang/OTP 24集成、阶梯式范围等

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/2System.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/2tap/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/2then/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/2Integer.extended_gcd/2

Code 模块得到了一个 cursor_context/2函数,它现在被用来支持IEx 自动完成,它被Livebook等项目用来提供智能提示

EEx应用程序也得到了扩展,以提供文本段的元数据。这使得Surface和Phoenix LiveView团队能够实现一种叫做HEEx的新模板语言,它可以验证HTML和EEX。最后,Registry 模块支持:compressed 选项,这对通过Absinthe管理数十万订阅的GraphQL应用很有用。

关于所有变化的完整列表,请看完整的发布说明。查看安装部分以获得Elixir的安装,并阅读我们的入门指南以了解更多。

祝你玩得开心!

© 2012-2021 Elixir团队。保留所有权利。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享