rust属性

一、属性是什么

属性是一种由编译器使用的元数据。

二、属性语法

内部属性以 #! 开头,应用于包含它的程序项。

   #![ Attr ]

外部属性以# 开头,应用于属性后面的内容。

   #[ Attr ]

Attr可以是以下形式

   IDENTIFIER
   IDENTIFIER = (STRING_LITERAL | RAW_STRING_LITERAL)
   IDENTIFIER ( ( IDENTIFIER (, IDENTIFIER)* ,? )? )
   IDENTIFIER ( ( MetaNameValueStr (, MetaNameValueStr)* ,? )? )

例子:

#![crate_type = "lib"]
// 标记为单元测试的函数
#[test]
fn test_foo() {
     /* ... */
}
// 一个条件编译模块
#[cfg(target_os = "linux")]
mod bar {
     /* ... */
}
// 用于静音lint检查后报告的告警和错误提醒
#[allow(non_camel_case_types)]
type int8_t = i8;
// 适用于整个函数的内部属性
fn some_unused_variables() {
     #![allow(unused_variables)]
     let x = ();
     let y = ();
     let z = ();
}

三、属性分类

(一)内置属性
所有内置属性:


    条件编译(Conditional compilation)
        cfg — 控制条件编译。
        cfg_attr — 选择性包含属性。
    测试(Testing)
        test — 将函数标记为测试函数。
        ignore — 禁止测试此函数。
        should_panic — 表示测试应该产生panic。
    派生(Derive)
        derive — 自动部署trait实现
        automatically_derived — 用在由derive创建的实现上的标记。
    宏(Macros)
        macro_export — 导出声明宏(macro_rules宏),用于跨crate的使用。
        macro_use — 扩展宏可见性,或从其他crate导入宏。
        proc_macro — 定义类函数宏。
        proc_macro_derive — 定义派生宏。
        proc_macro_attribute — 定义属性宏。
    诊断(Diagnostics)
        allow、warn、deny、forbid — 更改默认的lint检查级别。
        deprecated — 生成弃用通知。
        must_use — 为未使用的值生成lint提醒。
    ABI、链接(linking)、符号(symbol)、和FFI
        link — 指定要与外部(extern)块链接的本地库。
        link_name — 指定外部(extern)块中的函数或静态项的符号(symbol)名。
        no_link — 防止链接外部crate。
        repr — 控制类型的布局。
        crate_type — 指定crate的类别(库、可执行文件等)。
        no_main — 禁止发布main符号(symbol)。
        export_name — 指定函数或静态项导出的符号(symbol)名。
        link_section — 指定用于函数或静态项的对象文件的部分。
        no_mangle — 禁用对符号(symbol)名编码。
        used — 强制编译器在输出对象文件中保留静态项。
        crate_name — 指定crate名。
    代码生成(Code generation)
        inline — 内联代码提示。
        cold — 提示函数不太可能被调用。
        no_builtins — 禁用某些内置函数。
        target_feature — 配置特定于平台的代码生成。
        track_caller - 将父调用位置传递给std::panic::Location::caller()。
    文档(Documentation)
        doc— 指定文档。更多信息见 The Rustdoc Book。Doc注释会被转换为doc属性。
    预导入包(Preludes)
        no_std — 从预导入包中移除std。
        no_implicit_prelude — 禁用模块内的预导入包查找。
    模块(Modules)
        path — 指定模块的源文件名。
    极限值设置(Limits)
        recursion_limit — 设置某些编译时操作的最大递归限制。
        type_length_limit — 设置多态类型(polymorphic type)单态化过程中构造具体类型时所做的最大类型替换次数。
    运行时(Runtime)
        panic_handler — 设置处理panic的函数。
        global_allocator — 设置全局内存分配器。
        windows_subsystem — 指定要链接的windows子系统。
    特性(Features)
        feature— 用于启用非稳定的或实验性的编译器特性。参见 The Unstable Book 了解在rustc中实现的特性。
    类型系统(Type System)
        non_exhaustive — 表明一个类型将来会添加更多的字段/变体。

(二)宏属性
(三)派生宏辅助属性
(四)外部工具属性
由外部工具使用的属性,这些工具必须存在。
这种属性的路径的第一段是工具的名称。
如果使用了 no_implicit_prelude属性,则外部工具属性不可用。
目前能识别的工具是 “clippy” 和 “rustfmt”。

// 告诉rustfmt工具不要格式化以下元素。
#[rustfmt::skip]
struct S {
}
// 控制clippy工具的“圈复杂度”极限值。
#[clippy::cyclomatic_complexity = "100"]
pub fn f() {}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Rust 中, `impl` 块用于定义类型的方法。在这些方法中, `self` 是表示当前类型实例的关键字, 它有三种不同的属性: - `self`: 表示不可变的当前类型实例的引用。 - `&self`: 表示可变的当前类型实例的引用。 - `&mut self`: 表示独占的可变的当前类型实例的引用。 其中,用 self 代表的是不可变的引用, 如果需要对实例进行修改, 那么需要使用 &mut self 代表可变引用。 这是 Rust 中访问控制的方式,保证了程序运行时的线程安全。 ### 回答2: 在 Rust 中,`impl` 代码块中的 `self` 关键字用于表示实现类型本身的一个实例。实际上,`self` 作为方法的隐式参数,允许我们在对类型进行操作时访问它的属性和方法。 `self` 可以具备以下几种属性: 1. `self` 可以是一个值类型 `self: Self`,其中 `Self` 是实现类型本身的关联类型。例如,对于一个结构体类型 `Person` 的实现类型 `impl Person`,`self` 就是 `Person` 的一个实例,我们可以通过 `self` 来访问 `Person` 的所有属性和方法。 2. `self` 可以是一个可变引用类型 `self: &mut Self`,其中 `Self` 是实现类型本身的可变引用。这种情况下,我们可以通过 `self` 来改变实现类型的属性值。 3. `self` 可以是一个不可变引用类型 `self: &Self`,表示 `Self` 的不可变引用。这种情况下,我们可以通过 `self` 来访问实现类型的属性,但不能对其进行修改。 除了以上几种,Rust 还支持其他用法来表示 `self` 的属性,例如 `self: Box<Self>` 表示 `self` 是一个实现类型的堆分配对象的所有权,`self: Rc<Self>` 表示 `self` 是一个引用计数对象的引用,等等。 总之,通过 `self` 关键字,我们可以在 `impl` 块中访问实现类型的属性和方法,并且根据需要,还可以对其进行修改或获取所有权。这为我们在 Rust 中编写可靠和高效的代码提供了很大的灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值