Rust 属性是什么?


最近,在同事的推荐下,试了一下RUST。总体来说,非常优秀,特别是所有权模型。在手动内存管理与垃圾回收之间,开辟了一条新道路——编译阶段自动判断释放内存。

从一段代码说起

当看到RUST属性一节时,遇到了麻烦。RUST属性给人的感觉是很多,很乱,很杂,看得脑壳疼。于是先放着,过了两天在回看。

我是在练习activ Web框架时遇到属性,请看如下代码:

//定义路由,绑定函数
#[get("/")]
async fn hello() -> impl Responder {
    HttpResponse::Ok().body("Hello world!")
}

// activ 框架内定义的函数
#[proc_macro_attribute]
pub fn get(args: TokenStream, input: TokenStream) -> TokenStream {
    route::generate(args, input, route::GuardType::Get)
}

这段代码出现了两个属性,分别代表什么意思呢?#[proc_macro_attribute]属性,用于表示函数get是一个过程宏,即用于生成函数的宏。宏参数args对应#[get("/")]"/",宏参数input对应整个hello。也就是说,输入hello函数和其上的#[get("/")],输出新函数。

属性是什么?

属性是什么?在编程语言中,属性一定是对象的属性。也就是说,必须先有对象,再谈属性。如果没有对象,那就变成了空谈属性。如同不谈数据结构,只谈算法一样。

如果你是前端,应该非常熟悉属性。比如<div style="color: red">,一个divDOM对象,该对象拥有一个属性style。浏览器能将该对象,及其属性,解析并显示。在RUST,什么被定义为对象呢?Crate、mod、fn、macro、struct等。属性一定伴随对象左右,在RUST中,表现为:

#[get("/")] //这是属性
async fn hello() -> impl Responder { // 这是对象
    HttpResponse::Ok().body("Hello world!")
}

#[attribute] //这是属性
struct Person{ // 这是对象
    name: String,
    age: 1
}

当给对象加上属性之后,编译器便可以对对象进行处理。最简单的算法是:判断对象有无该属性,若有,进行特殊处理。

其他语言有属性概念吗?

具我所知,肯定有。熟悉C#的人,认为属性概念来自C#。而熟悉Java的人,会说:“属性不就是Java中的注解吗?”确实是的,语法功能相同。

最好类比理解,还是来自前端HTMLHTML属性及其丰富,不仅有描述属性,还有事件属性。前者定义对象的大小样式、能否编辑等,后者定义点击对象触发事件。

小结

谈属性的前提,是先谈对象。确定了对象,再确定对象有什么属性?能对对象执行什么操作?这点,RUST官方文档,没有写好。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 2

java里面属性是成员变量

3年前 评论

我也觉得属性这一点不好理解 :grimacing:

5个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
1
粉丝
1
喜欢
1
收藏
0
排名:3321
访问:80
私信
所有博文
社区赞助商