< 返回版块

MutelyMilo 发表于 2021-06-08 11:22

#[macro_use] extern crate rocket;

#[cfg(test)] mod tests;

#[derive(FromFormField)]
enum Lang {
    #[field(value = "en")]
    English,
    #[field(value = "ru")]
    #[field(value = "ру")]
    Russian
}

在rust中我遇到大部分的类似代码,请问各位大佬这是什么意思,是做什么的? 是指定的语法吗? 是否有哪些可以方便记下来的窍门呢? 如果没有窍门的话,那么如何决定什么时候使用,什么时候不需要使用?

评论区

写评论
作者 MutelyMilo 2021-06-08 14:12

正在,还没看到这。提前看到该语法就产生了些迷惑。感谢哈

--
👇
苦瓜小仔: 你给错链接了啦。这个链接讲的是声明宏。

这是属性宏,Rust 不止有这一种宏。

Rust book > ch19-06-macros 对各种宏介绍地很清楚,楼主,你学 Rust 连这本“圣经”都不看看嘛?

--
👇
chinagxwei: https://zjp-cn.github.io/tlborm/

可以看看社区之前发的

--
👇
MutelyMilo: 追问大佬,所以这种语法全是宏,没有其他例外的吧

--
👇
chinagxwei: 可以去看看rust宏相关的内容

苦瓜小仔 2021-06-08 12:53

你给错链接了啦。这个链接讲的是声明宏。

这是属性宏,Rust 不止有这一种宏。

Rust book > ch19-06-macros 对各种宏介绍地很清楚,楼主,你学 Rust 连这本“圣经”都不看看嘛?

--
👇
chinagxwei: https://zjp-cn.github.io/tlborm/

可以看看社区之前发的

--
👇
MutelyMilo: 追问大佬,所以这种语法全是宏,没有其他例外的吧

--
👇
chinagxwei: 可以去看看rust宏相关的内容

chinagxwei 2021-06-08 12:26

https://zjp-cn.github.io/tlborm/

可以看看社区之前发的

--
👇
MutelyMilo: 追问大佬,所以这种语法全是宏,没有其他例外的吧

--
👇
chinagxwei: 可以去看看rust宏相关的内容

作者 MutelyMilo 2021-06-08 12:20

十分感谢,茅塞顿开。

--
👇
Aya0wind: 这是属性宏,属性宏有的是库里自定义提供的,有的是rust自带的。你可以类比一下java里的注解,用于开关一些特性或者生成代码的。 至于记忆,其实没啥要记的,记个基本的语法就行了,也就是#[属性名=“属性值“],或者#[属性名(属性值)],这种语法。因为这个东西的内容是完全可自定义的,比如你这里面就有三方库定义的属性宏。重要的应该是去看库给的文档,文档里说明了这些属性都有什么意义。例如你这里的#[derive(xx)],这个宏就是用来给结构体自动实现括号里的那个trait,编译器在展开这个宏后会生成一段用于实现这个trait的代码。 而对于像#[macro_use]这样的编译器提供的属性,就查rust文档就行了,比如这个宏就是指明导出其作用的那个crate里面的宏。

Aya0wind 2021-06-08 12:10

这是属性宏,属性宏有的是库里自定义提供的,有的是rust自带的。你可以类比一下java里的注解,用于开关一些特性或者生成代码的。 至于记忆,其实没啥要记的,记个基本的语法就行了,也就是#[属性名=“属性值“],或者#[属性名(属性值)],这种语法。因为这个东西的内容是完全可自定义的,比如你这里面就有三方库定义的属性宏。重要的应该是去看库给的文档,文档里说明了这些属性都有什么意义。例如你这里的#[derive(xx)],这个宏就是用来给结构体自动实现括号里的那个trait,编译器在展开这个宏后会生成一段用于实现这个trait的代码。 而对于像#[macro_use]这样的编译器提供的属性,就查rust文档就行了,比如这个宏就是指明导出其作用的那个crate里面的宏。

作者 MutelyMilo 2021-06-08 11:49

追问大佬,所以这种语法全是宏,没有其他例外的吧

--
👇
chinagxwei: 可以去看看rust宏相关的内容

chinagxwei 2021-06-08 11:27

可以去看看rust宏相关的内容

1 共 7 条评论, 1 页