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">
,一个div
DOM对象,该对象拥有一个属性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中的注解吗?”确实是的,语法功能相同。
最好类比理解,还是来自前端HTML
。HTML
属性及其丰富,不仅有描述属性,还有事件属性。前者定义对象的大小样式、能否编辑等,后者定义点击对象触发事件。
小结
谈属性的前提,是先谈对象。确定了对象,再确定对象有什么属性?能对对象执行什么操作?这点,RUST
官方文档,没有写好。
本作品采用《CC 协议》,转载必须注明作者和本文链接
java里面属性是成员变量
我也觉得属性这一点不好理解 :grimacing: