Crystal 1.5.0 发布,语法类似 Ruby 的编译型编程语言


Crystal 是一种通用的、面向对象的编程语言,由 Ary Borenszweig、Juan Wajnerman、Brian Cardiff 和 300 多名贡献者设计开发。Crystal 的语法受到 Ruby 的启发,属于编译语言,具有静态类型检查功能,但一般不需要指定变量或方法参数的类型,可实现接近 C/C++ 的性能。它的类型由一个先进的全局类型推理算法来解决。

 Crystal 1.5.0 已发布,此版本包含了自 1.4.1 版本以来由 23 位贡献者所做的 102 项更改。主要内容如下:

实现抽象的方法的参数DEF必须与名称匹配

为了提供更好的文档和健壮性,可以将参数与其名称(ref)显式关联:

class Foo
def foo(name : Int32) : Nil
p name
end
end

Foo.new.foo name: 42

因此,考虑参数的名称是其接口的一部分是必须的。然而,在 1.5.0 之前,编译器不会检查抽象方法的实现与其定义之间的参数名称是否匹配。也就是说,以下示例编译时没有错误或警告:

abstract class FooAbstract
abstract def foo(number : Int32) : Nil
end

class Foo < FooAbstract
def foo(name : Int32) : Nil
p name
end
end

从 1.5.0 ( #11915 ) 开始,上面的示例将引发警告:

 6 | def foo(name : Int32) : Nil
 ^---
Warning: positional parameter 'name' corresponds to parameter 'number' of the overridden method FooAbstract#foo(number : Int32), which has a different name and may affect named argument passing

实例变量的方法限制

 

当一个实例变量被赋值为一个无类型方法参数的值时,该参数被限制为与实例变量共享相同的类型。

例如以下代码:

class Foo
@x : Int64

def initialize(x)
@x = x
end
end

直到 1.4.1,xininitialize都不受限制,但这会导致几个问题:

  • 如果用户传递了一个不正确的参数,例如 Foo.new 'a',而不是在参数 'a' 中标记错误,它会指责 x 没有正确的类型。
  • 例如,如果我们改为传递 Int32,则不会执行自动转换: Foo.new 1 失败。
  • 生成的文档没有提供参数 x 类型的提示。

从 1.5.0 开始,在像 @x = x 这样的赋值中,参数 x 获取了 @x 的类型,有效地解决了上述三个问题。可以从 #12103 中阅读详细信息。

方法参数上允许的注释

现在可以为方法或宏的参数添加注释。作为说明,假设一个 linter 会在未使用参数时发出警告。

def foo(x); end# Warning: argument `x` is not used

然后我们可以向 linter 发出信号,在特定情况下不要警告我们。假设 linter 提供以下注解:

annotation MaybeUnused; end

将其应用于参数会删除警告(在这个特定的虚构 linter 中):

def foo(@[MaybeUnused] x); end# OK

在 #12039 中了解详细信息。

元组的常量索引器

当使用常量索引元组或命名元组时,类型检查器将正确推断所访问值的精确类型(#12012)。

KEY = "s"
foo = {s: "String", n: 0}

# Before 1.5.0 this failed; it would assume the type of foo[key] to be (String | Int32)
puts foo[KEY].size

加强 FILE.TEMPFILE安全保障

根据  #12076,临时文件的创建不允许在文件名的字符串中使用空字符。

NO_COLOR 合规性

编译器和解释器支持 NO_COLOR 环境变量来禁用终端上的彩色输出。可以通过将任何非空值设置为NO_COLOR来启用。#11984 中可查看详细信息。

向原生 WINDOWS 支持迈出一大步

Windows 上的并发运行时由功能正常的事件循环 (#12149 ) 支持。这跨越了通往原生 Windows 支持的道路上的一项重要检查。此外,现在有一个与 Windows 兼容的Makefile( #11773 )。

 

其他内容可以在更新公告中查阅:https://crystal-lang.org/2022/07/06/1.5.0-released.html 。


相關推薦

2023-07-19

Crystal 是一种通用的、面向对象的编程语言,由 Ary Borenszweig、Juan Wajnerman、Brian Cardiff 和 300 多名贡献者设计开发。 Crystal 的语法受到 Ruby 的启发,属于编译语言,具有静态类型检查功能,但一般不需要指定变量或方法参数的类

2022-04-09

Crystal 是一种通用的、面向对象的编程语言,由 Ary Borenszweig、Juan Wajnerman、Brian Cardiff 和 300 多名贡献者设计开发。Crystal 的语法受到 Ruby 的启发,属于编译语言,具有静态类型检查功能,但一般不需要指定变量或方法参数的类型

2023-01-11

Crystal 是一种通用的、面向对象的编程语言,由 Ary Borenszweig、Juan Wajnerman、Brian Cardiff 和 300 多名贡献者设计开发。Crystal 的语法受到 Ruby 的启发,属于编译语言,具有静态类型检查功能,但一般不需要指定变量或方法参数的类型

2023-04-16

Crystal 是一种通用的、面向对象的编程语言,由 Ary Borenszweig、Juan Wajnerman、Brian Cardiff 和 300 多名贡献者设计开发。Crystal 的语法受到 Ruby 的启发,属于编译语言,具有静态类型检查功能,但一般不需要指定变量或方法参数的类型

2022-04-26

CoffeeScript 2.7.0 发布了。CoffeeScript 是一套 JavaScript 转译语言,它会将类似 Ruby 语法的代码编译成 JavaScript,而且大部分结构都相似。CoffeeScript 拥有更严格的语法。 此版本更新内容包括: 现在支持导入断言语法

2023-04-24

日在社交网站发布招聘信息时,提到了他们团队对于各种编程语言的丰富使用经历。 接着他本人谈论了一些关于各种编程语言的感悟,其中包括 Golang、Rust、Java、Python,甚至提到了比较小众的 Vala。下面是对他发布内容的整理

2022-11-04

Rust 1.65.0 稳定版已发布。此版本包含多项重要的语法变更,以及编辑器和标准库方面的改动。值得关注的是,Rust 1.65 现在还启用了 MIR 内联来优化编译,为 crate 提供了 3-10% 的编译时间改进。 语言特性 为枚举类型使用#[non_exh

2022-08-19

Lux 0.7 已发布,这是一门函数式、具备静态类型的 Lisp 编程语言,支持在 Java 虚拟机、JavaScript、Python、Lua 和 Ruby 解释器上运行。 Lux 0.7 主要变化 新增 内联函数 支持将配置参数从构建描述 (build description) 传递给编译器 基

2023-09-08

开发)和 Ops(应用部署)。 Wasm 应用开发需要自己的编程语言生态系统和相关工具,如编译器、框架、库、工具和运行时。Dev 类别包括编程语言、运行时、应用程序框架edge/bare metal、AI  推理、嵌入式功能和工具。 Was

2023-10-10

TIOBE 公布了 2023 年 10 月的编程语言排行榜。 C# 和 Java 之间的差距越来越小,达到了历史新低,目前两者的差距仅为 1.2%。TIOBE CEO Paul Jansen 认为,如果这一趋势继续保持,那么 C# 将在两个月后超过 Java。 在所有编

2022-11-01

更和标准库变更等。 Idris 是一个类似 Haskell 的纯函数编程语言,类型系统支持 dependent types。 依赖模式匹配的依赖类型系统 简单的 C 函数接口 编译器级别的编码支持 where 语句,with 规则,简单的 case 表达式,模式匹配 l

2023-11-15

万份开发工作机会,以了解市场以及最热门、薪酬最高的编程语言。值得注意的是,本项研究只关注了来自美国的职位。在总共 1000 万个开发工作岗位中,有 130 万个有工资。在这 130 万个职位中,有 23 万个职位属于编程语言类

2022-09-13

Swift 5.7 现已发布,该版本包括对语言和标准库的主要添加、对编译器的增强以提供更好的开发人员体验、对 Swift 生态系统中的工具(包括 SourceKit-LSP 和 Swift 包管理器)的改进、改进的 Windows 支持等等。 语言和标准库 Swift 5.7

2022-02-28

Rust 1.59.0 稳定版已正式发布,新版本最值得关注的特性是支持在代码中内联汇编 (Inline assembly),其他变化包括:引入解构式赋值、默认关闭增量编译,以及 Const 泛型参数支持设置默认值等。 内联汇编 (Inline assembly) 此项特