755|5

2942

帖子

4

TA的资源

五彩晶圆(中级)

楼主
 

《Rust实战》结构体和枚举方法 [复制链接]

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语言。

此帖出自编程基础论坛

最新回复

标记一下,后面用到了好学习学习,非常感谢分享,好人一生平安!   详情 回复 发表于 2024-6-6 17:57
点赞 关注
 

回复
举报

7671

帖子

2

TA的资源

五彩晶圆(高级)

沙发
 

这块兼容C/C++语法不好吗?这种pascal语法不太习惯。

此帖出自编程基础论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

1388

帖子

1

TA的资源

五彩晶圆(初级)

板凳
 

大神,不支持snake-name,要求将printInfo改成了print_info

另外打印formatstring,少了一对{}

然后代码正确!

此帖出自编程基础论坛

点评

谢谢,我没有注意确实是少了一个{}占位符。  详情 回复 发表于 2024-5-7 16:18
 
 
 

回复

2942

帖子

4

TA的资源

五彩晶圆(中级)

4
 
hellokitty_bean 发表于 2024-5-7 15:43 大神,不支持snake-name,要求将printInfo改成了print_info 另外打印formatstring,少了一对{} 然后 ...

谢谢,我没有注意确实是少了一个{}占位符。

此帖出自编程基础论坛

点评

我是跟着代码体验一把,领悟知识点。。。。 瑕不掩瑜。。。。。。。  详情 回复 发表于 2024-5-8 08:31
 
 
 

回复

1388

帖子

1

TA的资源

五彩晶圆(初级)

5
 
bigbat 发表于 2024-5-7 16:18 谢谢,我没有注意确实是少了一个{}占位符。

我是跟着代码体验一把,领悟知识点。。。。

瑕不掩瑜。。。。。。。

此帖出自编程基础论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(中级)

6
 

标记一下,后面用到了好学习学习,非常感谢分享,好人一生平安!

此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表