当前位置: 首页 > >

[rust-003] rust by example学*过程点点滴滴杂记

发布时间:

1.println!是宏。所有以"!"结尾的看起来象函数的东西都是宏。rust的宏编译期间直接在抽象语法树上展开,其他语言比如c/c++的宏展开是字符串替换。宏的好处:1.不受参数数量限制 2.不受参数类型限制 3.领域特定语言。


2. write!是宏,它的返回值是fmt::Result,这个返回值必须被处理,否则会报warning,行如warning: unused `std::result::Result` that must be used。一个structure实现了Display,如果实现里只有一个write!宏调用,那么write!的返回值会作为Display的返回值,返回给调用方处理,如果实现里有多个write!宏调用,最后一个write!宏的返回值作为Display的返回值,其他的write!宏后面要加上一个"?",以表示已经处理返回值。这是显式处理的代价,这么做比较节省字符串,否则需要象java的异常处理一样,加上一堆try。


3.这个中括号太妖媚了:


for city in [
City { name: "Dublin", lat: 53.347778, lon: -6.259722 },
City { name: "Oslo", lat: 59.95, lon: 10.75 },
City { name: "Vancouver", lat: 49.25, lon: -123.1 },
].iter() {
println!("{}", *city);
}

4.数组和切片。数组的大小,编译时知道。切片的大小,编译时不知道。切片可以表示数组的一部分。


5.rust没有类。用户定义数据类型有两种,struct和enum,结构体和枚举。const和static创建常量。


6.结构体struct似乎没有构造函数一说,也没有私有公有成员变量一说,也没有析构函数一说。非常之原始。(后来发现有构造函数new,也有析构函数destory,结构体有私有共有成员变量。)


7.变量命名方式,最好还是匈牙利表示法显示说明变量的类型和作用,否则代码可读性差,需要想,这就可能会想错,想得跟自动推断不一样。


8.定义一个vector,向里面push一个无符号整数,那么vector元素的类型就自动推断为无符号正数。


9.trait,可以*似理解为java的接口。一个trait里有多个函数。可以把trait绑定到一个对象上实现各函数,绑定和实现在同一步。


10. rust的self和Self,不一样,前者相当于this,后者是所在对象的类型,比如返回值类型可以表示为Self。这个设定,只能说好吧,物尽其用。


impl From for Number {
fn from(item: i32) -> Self {
Number { value: item }
}
}

这里的Self表示类型。


11. rust的语法糖太多,没有必要,最好出一个精简的子集,太多的语法会坑。n @ 1 ?..= 12这种东西,没有必要...


12.method:把function attach到对象上称之为method。先定义一个struct,再用imple给这个struct添加method。


13.闭包,let one = || 1?写成这样有点过分。


14.module,可以有pub和private。


15.一个crate是一个编译单元,对应一个rs文件,如果rs文件里包含module,那么这个module的源码会被放到这个rs文件,然后再编译。


?


?



友情链接: