rust不是面向对象的的语言,其语言的特点非常类似C语言的结构,自然rust的结构体也和C语言的声明差不多,也没有任何私有方法和公有方法、属性等概念,但是rust提供了impl的关键字。这个关键字可以将结构体和它相关的函数绑定,在编程时可以简化调用参数。也可以使程序更好的理解。请参考如下的程序。
struct Fruit {
color: String,
weight: f32,
price:f32
}
impl Fruit {
fn printInfo(&self) {
println!("{},{}",self.color,self.weight,self.price);
}
}
fn main() {
let f = Fruit{color:String::from("green"), weight:12.5,price:2.3};
f.printInfo();
}
其中的函数printInfo在它的声明处,增加了impl的修饰,还出现了&self这样的引用,这就是声明一个于结构体的相关函数。其实可以发现这个声明只是一个减少了“参数的函数",其它没有在比其它的函数多出任何特性,这个声明比较面向对象语言的object可是减少了不少特性。没有了面向对象的的封装特性。
为了增加rust的抽象编程能力,rust增加了trait这一声明语法。trait非常类似于面向对象的”interface“特性。将有关的属性(变量)和方法组合成一个”语法体“,即:函数、类型、常量。
#![allow(unused)]
fn main() {
trait Example {
const CONST_NO_DEFAULT: i32;
const CONST_WITH_DEFAULT: i32 = 99;
type TypeNoDefault;
fn method_without_default(&self);
fn method_with_default(&self) {}
}
}
这一例程中有:
函数:method_without_default、method_with_default
类型:TypeNoDefault
常量:CONST_WITH_DEFAULT,CONST_NO_DEFAULT
triat也可以使用”超级“来模仿”继承“,超级就是在trait声明中包含另一个trait的声明。
#![allow(unused)]
fn main() {
trait Shape { fn area(&self) -> f64; }
trait Circle : Shape { fn radius(&self) -> f64; }
}
Circle包含一个shape的声明,调用时可以使用,circle.area()这样的调用方法。
#![allow(unused)]
fn main() {
trait Shape { fn area(&self) -> f64; }
trait Circle : Shape { fn radius(&self) -> f64; }
struct UnitCircle;
impl Shape for UnitCircle { fn area(&self) -> f64 { std::f64::consts::PI } }
impl Circle for UnitCircle { fn radius(&self) -> f64 { 1.0 } }
let circle = UnitCircle;
let circle = Box::new(circle) as Box<dyn Circle>;
let nonsense = circle.radius() * circle.area();
}
枚举就和C语言语法相差不大,但是多了可以转换数值这一限制。
#![allow(unused)]
fn main() {
enum Animal {
Dog,
Cat,
}
let mut a: Animal = Animal::Dog;
a = Animal::Cat;
}
从结构体和枚举来看rust的语法主要是对C语言的改进与C++语言的相似性很小。所以学习时应该多参考C语言。
|