Rust 1.34 编程语言发布

Mozilla项目开发的系统编程语言Rust 1.34已经发布。 该语言专注于内存安全,提供自动内存管理,并提供一种无需使用垃圾收集器或运行时即可实现高任务并行性的方法。

Rust 的自动内存管理使开发人员免于指针操作,并防止低级内存操作引起的问题,例如释放后内存访问、空指针取消引用、缓冲区溢出等。 为了分发库、确保组装和管理依赖关系,项目正在开发 Cargo 包管理器,它允许您一键获取程序所需的库。 crates.io 存储库支持托管库。

主要创新:

  • Cargo 包管理器添加了工具来处理可与 crates.io 公共注册表共存的替代包注册表。 例如,专有应用程序的开发人员现在可以使用自己的私有注册表(在 Cargo.toml 中列出依赖项时可以使用该注册表),并为其产品应用类似于 crates.io 的版本控制模型,以及将依赖项引用到两个 crate。 io 并保存到您自己的注册表中。

    将外部注册表添加到 ~/.cargo/config
    “[registries]”部分中提供了一个新选项“my-registry”,并且添加了“other-crate”选项以在“[dependencies]”部分中的 Cargo.toml 依赖项中提及外部注册表。 要连接到其他注册表,只需将身份验证令牌放入 ~/.cargo/credentials 文件中并运行命令
    “cargo login --registry=my-registry”并发布包 -
    “货物发布-registry=my-registry”;

  • 添加了对使用“?”运算符的完全支持。 在 doctests 中,它允许您使用文档中的示例代码作为测试。 以前的操作员
    “?” 仅当存在“fn main()”函数或“#[test]”函数时,才可用于处理测试执行期间的错误;

  • 在使用过程宏定义的自定义属性中,可以使用任意标记集(“#[attr($tokens)]”、“#[attr[$tokens]] 和 #[attr{$tokens}]”)。 以前,元素只能使用字符串文字以树/递归形式指定,例如“#[foo(bar, baz(quux, foo = “bar”))]”,但现在可以使用枚举 (' #[range(0. .10)]') 和类似“#[bound(T: MyTrait)]”的结构;
  • TryFrom 和 TryInto 特征已经稳定,允许进行类型转换和错误处理。 例如,像 from_be_bytes 这样的整数类型的方法使用数组作为输入,但数据通常是 Slice 类型,并且手动在数组和切片之间进行转换是有问题的。 借助新特征,可以通过调用 .try_into() 即时执行指定操作,例如“let num = u32::from_be_bytes(slice.try_into()?)”。 对于始终成功的转换(例如,从类型 u8 到 u32),添加了 Infallible 错误类型以允许透明地使用
    TryFrom 用于“From”的所有现有实现;

  • 弃用了 CommandExt::before_exec 函数,该函数允许在 exec 之前执行处理程序,该处理程序在 fork() 调用后分叉的子进程的上下文中执行。 在这种情况下,父进程的某些资源(例如文件描述符和映射的内存区域)可能会重复,这可能会导致未定义的行为和库的错误操作。
    建议使用不安全函数 CommandExt::pre_exec 代替 before_exec。

  • 稳定的有符号和无符号原子整数类型,大小范围为 8 到 64 位(例如 AtomicU8),以及有符号类型 NonZeroI[8|16|32|54|128]。
  • API 的新部分已移至稳定类别,包括 Any::type_id、Error::type_id、slice::sort_by_cached_key、str::escape_*、str::split_ascii_whitespace、Instant::checked_[add|sub ] 和 SystemTime 方法已稳定::checked_[add|sub]。 iter::from_fn 和 iter::successors 函数已经稳定;
  • 对于所有整数类型,实现了checked_pow、saturating_pow、wrapping_pow和overflowing_pow方法;
  • 添加了通过指定“-C linker-plugin-lto”构建选项在链接阶段启用优化的功能(rustc 将 Rust 代码编译为 LLVM 位代码,这允许应用 LTO 优化)。

来源: opennet.ru

添加评论