651|10

6969

帖子

11

TA的资源

版主

楼主
 

《Rust实战》学习结构体 [复制链接]

第三章主要是讲复合数据类型,首先是学习结构体。首先我创建如下代码:

#[derive(Debug)]
struct File {
    name: String,
    data: Vec<u8>,
}
fn main() {
    let fl = File {
        name: String::from("fl.txt"),
        data: Vec::new(),
    };

    let fl_name = &fl.name;
    let fl_length = &fl.data.len();

    println!("{:?}",fl);
    println!("{} is {} bytes long!", fl_name, fl_length);
}

在struct File这里定义了一个结构体,然后在main中实例化了fl,然后提取他的.name,long,并打印出来。

这个程序里面有挺多的新知识,作者做出了详细的释义。

【感想】

现在学习起来越来越难了,如果不经常使用,这些生涩的概念学习起来,比较困难呀。

此帖出自编程基础论坛

最新回复

加油!跟着大家学   详情 回复 发表于 2024-4-28 15:09
点赞 关注
 

回复
举报

6969

帖子

11

TA的资源

版主

沙发
 

使用imple为结构体添加方法

给结构做添加方法,好象是我接触编程以来的新事物,作者通过说明其他语言的类,与Rust的给结构体添加方法,用了图形来表示。二者目的一样。

在以下代码中,使用impl来改善一个File的操作:

#![allow(unused_variables)]

#[derive(Debug)]
struct File {
    name: String,
    data: Vec<u8>,
}

impl File {
    fn new(name: &str) -> File {
        File {
            name: String::from(name),
            data: Vec::new(),
        }
    }

    fn new_with_data(
        name: &str,
        data: &Vec<u8>,
    ) -> File {
        let mut f = File::new(name);
        f.data = data.clone();
        f
    }

    fn read(
        self: &File,
        save_to: &mut Vec<u8>,
    ) -> usize {
        let mut tmp = self.data.clone();
        let read_length = tmp.len();
        save_to.reserve(read_length);
        save_to.append(&mut tmp);
        read_length
    }
}

fn open(f: &mut File) -> bool {
    true
}

fn close(f: &mut File) -> bool {
    true
}


fn main() {
    let f3_data: Vec<u8> = vec![
        114,117,115,116, 33
    ];

    let mut f3 = File::new_with_data("2.txt", &f3_data);

    let mut buffer: Vec<u8> = vec![];

    open( &mut f3);
    let f3_length = f3.read(&mut buffer);
    close(&mut f3);

    let text = String::from_utf8_lossy(&buffer);


    println!("{:?}",f3);
    println!("{} is {} bytes long!", &f3.name, f3_length);
    println!("{}",text);
}

在这个例子中,给File添加了new,read方法,这使得操作起来更方便。

此帖出自编程基础论坛
 
 
 

回复

4919

帖子

12

TA的资源

版主

板凳
 
结构体这里我有疑问,没搞懂。
就是s1声明了,s2部分用s1数据生成,然后基本类型都copy了,复合类型所有权也给人家了。s1剩下啥了?
此帖出自编程基础论坛

点评

今天学到了一个讲法: 请注意,结构更新语法就像带有 = 的赋值,因为它移动了数据,就像我们在“变量与数据交互的方式(一):移动”部分讲到的一样。在这个例子中,总体上说我们在创建   详情 回复 发表于 2024-4-27 12:50
我也是刚学到这里,还搞不懂他怎么去用,但是感觉他的方法封装还是挺有好处的。给一个结构写了几种方法,从来没有遇见过。  详情 回复 发表于 2024-4-26 21:37
 
 
 

回复

6969

帖子

11

TA的资源

版主

4
 
吾妻思萌 发表于 2024-4-26 18:09 结构体这里我有疑问,没搞懂。 就是s1声明了,s2部分用s1数据生成,然后基本类型都copy了,复合类型所有权 ...

我也是刚学到这里,还搞不懂他怎么去用,但是感觉他的方法封装还是挺有好处的。给一个结构写了几种方法,从来没有遇见过。

此帖出自编程基础论坛
 
 
 

回复

6969

帖子

11

TA的资源

版主

5
 
吾妻思萌 发表于 2024-4-26 18:09 结构体这里我有疑问,没搞懂。 就是s1声明了,s2部分用s1数据生成,然后基本类型都copy了,复合类型所有权 ...

今天学到了一个讲法:

请注意,结构更新语法就像带有 = 的赋值,因为它移动了数据,就像我们在“变量与数据交互的方式(一):移动”部分讲到的一样。在这个例子中,总体上说我们在创建 user2 后不能就再使用 user1 了,因为 user1 的 username 字段中的 String 被移到 user2 中。如果我们给 user2 的 email 和 username 都赋予新的 String 值,从而只使用 user1 的 active 和 sign_in_count 值,那么 user1 在创建 user2 后仍然有效。active 和 sign_in_count 的类型是实现 Copy trait 的类型,所以我们在“变量与数据交互的方式(二):克隆” 部分讨论的行为同样适用。

此帖出自编程基础论坛

点评

时时刻刻谨记自己的数据类型,和传入的所有权,啊感觉有点难~还是没到那个境界,我再研究研究  详情 回复 发表于 2024-4-27 13:26
 
 
 

回复

4919

帖子

12

TA的资源

版主

6
 
吾妻思萌 发表于 2024-4-26 18:09
结构体这里我有疑问,没搞懂。
就是s1声明了,s2部分用s1数据生成,然后基本类型都copy了,复合类型所有权 ...

今天学到了一个讲法:

请注意,结构更新语法就像带有&nbsp;=&nbsp;的赋值,因为它移动了数据,就像我们在&ldquo;变量与数据交互的方式(一):移动&rdquo;部分讲到的一样。在这个例子中,总体上说我们在创建&nbsp;user2&nbsp;后不能就再使用&nbsp;user1&nbsp;了,因为&nbsp;user1&nbsp;的&nbsp;username&nbsp;字段中的&nbsp;String&nbsp;被移到&nbsp;user2&nbsp;中。如果我们给&nbsp;user2&nbsp;的&nbsp;email&nbsp;和&nbsp;username&nbsp;都赋予新的&nbsp;String&nbsp;值,从而只使用&nbsp;user1&nbsp;的&nbsp;active&nbsp;和&nbsp;sign_in_count&nbsp;值,那么&nbsp;user1&nbsp;在创建&nbsp;user2&nbsp;后仍然有效。active&nbsp;和&nbsp;sign_in_count&nbsp;的类型是实现&nbsp;Copy&nbsp;trait 的类型,所以我们在&ldquo;变量与数据交互的方式(二):克隆&rdquo;&nbsp;部分讨论的行为同样适用。

时时刻刻谨记自己的数据类型,和传入的所有权,啊感觉有点难~还是没到那个境界,我再研究研究
此帖出自编程基础论坛
 
 
 

回复

755

帖子

5

TA的资源

纯净的硅(高级)

7
 

楼主分享的RUST语言的结构体,应该和C++、java中的类的内容类似吧,定义形式感觉和JavaScript类似

此帖出自编程基础论坛

点评

Rust独到之处吧,跟谁都不像,跟谁都有点像。  详情 回复 发表于 2024-4-27 20:58
 
 
 

回复

6969

帖子

11

TA的资源

版主

8
 
chejm 发表于 2024-4-27 14:33 楼主分享的RUST语言的结构体,应该和C++、java中的类的内容类似吧,定义形式感觉和JavaScript类似

Rust独到之处吧,跟谁都不像,跟谁都有点像。

此帖出自编程基础论坛
 
 
 

回复

1375

帖子

1

TA的资源

五彩晶圆(初级)

9
 

这几天忙乱,还没有到大哥这部分内容,先暂时立下一个flag,后续验证

此帖出自编程基础论坛

点评

加油 我今天开始学习第四章了。  详情 回复 发表于 2024-4-28 11:33
 
 
 

回复

6969

帖子

11

TA的资源

版主

10
 
hellokitty_bean 发表于 2024-4-28 09:44 这几天忙乱,还没有到大哥这部分内容,先暂时立下一个flag,后续验证

加油

我今天开始学习第四章了。

此帖出自编程基础论坛
 
 
 

回复

7608

帖子

18

TA的资源

五彩晶圆(高级)

11
 

加油!跟着大家学

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

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

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表