Crystal 0.31.0 发布了。Crystal 是一门基于 LLVM 的可编译的静态类型语言,它的整体设计尽可能地接近 Ruby 的体验,语法与各种标准库的接口都几乎和 Ruby 一样(但兼容 Ruby 不是它的目标)。
开发团队表示他们热爱 Ruby 编写代码的效率,又倾心于 C 语言的性能,所以打造的 Crystal 语言给开发者提供了 Ruby 一样的语法体验,而且还拥有 C 一样的性能。
新版本附带多线程预览、性能改进以及所有常规 std-lib 中的常规修复和改进。以下是此版本的一些更新亮点:
语言变更
Crystal 0.31.0 版本有一种新的、更简洁的方法来声明方法中未捕获的块的类型限制。
无名参数&现在可以出现在列表的末尾。它可以有选择地具有类型限制,编译器和 doc 工具将使用该类型限制。
def foo(x, y, & : Int32 -> Int32)
end
编译器
从 Crystal 0.29 开始,编译器可以发出警告。由于默认设置已更改为 –warnings=all,因此该功能现已退出使用。
LLVM 8.0 在 Linux 官方软件包中使用。 #8155
标准库
多线程(Multithreading)
这是最令人期待的功能之一,即使在合并 #8112 之后,也有一些迭代可修复极端情况并稳定运行时间。
数字(Numeric)
很久以前曾宣布 std-lib 的数字部分进行了一些更改,终于在此发行版中得到了实现。
默认情况下处理溢出。 Int32::MAX+1 将不再环绕。如果需要非溢出操作,则可以使用 Int32::MAX&+1。与 – 和 * 相同。在某些体系结构中,LLVM 需要compiler-rt 库。官方表示移植了所需的内容,因此没有外部依赖性。如果受到新的默认行为的阻止,请使用 -Ddisable_overflow 来保持与 0.30 相同的语义,或者使用 -Dskip_crystal_compiler_rt 来不包含 compiler-rt 端口并链接到其另一个版本。另外,disable_overflow 标志是临时的。
/ 将始终代表算术除法。这也意味着其结果将是浮点数(某种形式)。表达式 a.sum/a.size 将返回平均值,无论 a 中使用的是哪种数字类型。如果要保留左侧运算符类型的整数除法,请使用 //。
集合(Collections)
集合中的主要变化与性能有关。数组和哈希值的变化见 #8017、#8042、#8048、#8087 和 #8116。
序列化(Serialization)
XML 有重大更改,但主要 API 并未更改。可能更具影响力的变更是,JSON 和 YAML 反序列化现在可以处理具有 nilable 字段的 NamedTuple。
Files
优化不仅存在于集合中。Path#join 和 Dir.glob 中也都存在改进。 #8078、#8082、#8081
Networking
不建议使用 HTTP::Server::Response#respond_with_error,而推荐使用 #respond_with_status,它还将处理连接的最终状态和默认状态描述。
内置的 HTTP 服务器将以更受控的方式响应具有较长 URI 或较大标头字段的请求。响应将分别是 414 Request-URI too long 和 431 Request Header Fields Too Large。
Other deprecations
Markdown 模块不再在 std-lib 中公开,它仍在内部使用。目前,最好的替代品是 icyleaf/marked。
Crystal-db 0.7.0
此次还提供了新版本的 crystal-lang/crystal-db。解决了一些可能导致创建的连接数量达到峰值的并发问题,这也是多线程上下文的重要更新。
为避免支持带有 Array 值的列的驱动程序存在歧义,还需要进行重大更改。 db.query(“ SELECT …”,[1,2])现在表示单个参数:[1,2],而 db.query(“ SELECT …”,args:[1,2])表示将两个参数传递给查询。
发布公告:https://crystal-lang.org/2019/09/23/crystal-0.31.0-released.html
转自 https://www.oschina.net/news/110114/crystal-0-31-0-released