什么是crate属性,我应该在哪里添加它?

124
为了了解Rust的工作原理,我决定研究一个基于终端的文本编辑器,叫做 Iota。我克隆了仓库并运行了cargo build,结果收到了以下提示:

error: *if let* syntax is experimental

help: add #![feature(if_let)] to the crate attributes to enable
我应该把#![feature(if_let)]添加到哪个crate属性中呢?

4
值得一提的是,Rust 的更新版(夜间版)已默认启用了此功能,因此更新 Rust 也将解决您的问题。 - Shepmaster
1个回答

133

一个箱子属性是一个应用于封闭上下文 (#![...]) 的属性 (#[...])。这个属性必须添加到你的 crate 根目录 的顶部,因此上下文就是 crate 本身:

#![attribute_name]
#![attribute_name(arg1, ...)]

如果您正在创建:
  • 一个库 - 根目录将是名为lib.rs的文件
  • 一个应用程序 - 根目录将是您构建的主要.rs文件。在许多情况下,这将被称为main.rs
  • 一个集成测试 - 根目录是tests/中的每个文件
  • 一个示例 - 根目录是examples/中的每个文件

Rust编程语言Rust参考手册都有关于属性的介绍。不稳定的书籍中包含了一份功能标志列表以及简要的文档说明。

有许多不同的crate属性,但是feature crate属性(#![feature(feature1, feature2)])只能在夜间版编译器中使用。不稳定的功能不允许在稳定版本的Rust中使用。


为什么 #![...] 被称为内部属性?在 Substrate 项目中,文件顶部有一行 #![cfg_attr(not(feature = "std"), no_std)],这行代码是什么意思?它是否与通常在 Cargo.toml 文件中声明的 [features] default = ['std'] 定义有关系? - gfan
@gfan 是因为它是应用于所在对象内部的属性。另请参阅 https://docs.rust-embedded.org/book/intro/no-std.html。 - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接