rust语言新特的语法很难让人适应,在没有全面的了解rust语法的情况下甚至连一个实用的小程序都无法编写,例如:如果比较两个数值 0.1 和1的大小都会报出错误,就如唐长老取经一般“步步挨灾,处处受难”。为什么rust会设计这么严苛的语法规则呢,其实这些语言语法特性都是针对C,C++语言经常出现或疏忽的程序问题而设计的,rust的语法特点其实质就是用来在编译时跟踪变量的,目的是使用和减少动态内存的分配管理任务。使得在编译阶段就可以发现程序的问题,尤其是内存管理方面。所以在学习时重要的是去理解语法的限制规则,不要盲目地使用已往的编程语法思路。
rust的类型和其它的语法一样,也是分简单的变量类型/标量类型(称数据类型更合适)和复合数据类型、组合数据类型(数组类型、切片类型),通常简单类型为语言语法定义的内置类型,复合类型为“用户自定义类型”。rust的简单数据类型和其它语言一样,如:无符号整数、整数、浮点数等,但是rust中的类型在数值比较时非常的严格,不同数据类型是不可以做比较的,如果需要时需要做类型的转换地,只有相同“trait”的数据类型才可以使用符号编程。在引入其它语言的类型时需要使用:#![allow(unused_variables)]这样的宏来通知编译器放宽编译限制。
元组tuple,Rust 支持元组 tuple。一种有趣的数据类型,“元组”是一种可以使用索引访问变量的复合数据类型,如下程序:
fn main() {
let tuple:(i32,f64,u8) = (-325,4.9,22);
println!("{:?}",tuple);
}
复合的数据类型由三种简单类型复合,访问方法:
tuple.0 // -325
tuple.1 // 4.9
tuple.2 // 22
数组,这种类型是计算机中最常用的类型,但是确和其它语言不同,rust的语言的数组有三种类型,不可变的数据列表型、切片数据类型、可变数组类型VEC,rust的数组分的类型非常的细的原因就是为了在静态时跟踪变量的作用域,所以需要仔细地进行规划。
枚举,这个和C/C++语言差不多。只是提供了一些编程地便利,match等类型。
结构体,这是最为复杂的类型,实际的概念非常的多,但是rust的宗旨是能够静态编程解决的事情不会托到动态阶段(运行时),能够放到栈(stack)内存的不会放到堆(heap)内存,rust中没有象C++ new这样的操作对象操作,rust的new其实是一个普通的函数,而不是象C++当中的那样的关键字函数(构造函数),因为C++中会把对象Object的内存分配到堆heap上,这样导致C++的复杂内存管理,出现指针悬垂、空指针等问题。
还有就是rust没有类的概念和结构体,rust中的结构体只是用来作为关联函数的索引标记,虽然形式上看上如C++一样的调用规则,但是这个函数和结构体没有任何“关系”,是真正意义上的
shap.width,shap.height
没有关系,只是一个独立的函数,而不像C++一样的面向对象语言,方法/函数是属于对象的一个指针或索引。rust只是把结构体相关的函数搞的象C++语法一样的语法糖。
再有就是trait这一概念,trait也是依附于结构体的一种类似接口的概念,但是没有具体的实例化,而是一种依附于结构体struct的类型转换相关特性。这个有点抽象的意思,这种设计的目的是设计一种类似C++语法的“继承”一样的编程概念。另一种说法就是,rust当中用来不同结构体struct类型的转换规则,虽然不是很严格,也就是类似而已。
rust中的各种类型和严格的类型检查是rust的特色,也是rust能够写出安全软件的保证,所以学习时一定不要和其它语言概念关联,只要知道rust语法的目的就可以。
|