1. //Rust 并不允许只将某个字段标记为可变
  2. struct User {
  3. email: String,
  4. name:String,
  5. age:i32,
  6. sex:String,
  7. active:bool,
  8. }
  9. fn main() {
  10. let mut user1=User{
  11. email: String::from("1@qq.com"),
  12. name:String::from("hehe"),
  13. age:23,
  14. sex: String::from("man"),
  15. active:true,
  16. };
  17. user1.name =String::from("zhangsan");
  18. let user2 = User {
  19. email: String::from("3@qq.com"),
  20. name: String::from("lisa"),
  21. ..user1 //其余值来自 user1 变量中实例的字段,简写形式
  22. };
  23. let user3=set_user_value(String::from("2@qq.com"),String::from("xiaohong"));
  24. }
  25. fn set_user_value(email:String,name:String)->User {
  26. //参数名和结构体的名字相同时,可简写比如email:email 可以直接写email,
  27. User {
  28. email,
  29. name,
  30. age:23,
  31. sex:String::from("man"),
  32. active:true,
  33. }
  34. }

User 结构体的定义中,我们使用了自身拥有所有权的 String 类型而不是 &str 字符串 slice 类型。

这是一个有意而为之的选择,因为我们想要这个结构体拥有它所有的数据,为此只要整个结构体是有效的话其数据也是有效的。

可以使结构体存储被其他对象拥有的数据的引用,不过这么做的话需要用上 生命周期(lifetimes)

一个示例

  1. //使用结构体的好处组织性
  2. //增加注解来派生 Debug trait,并使用调试格式打印 Rectangle 实例
  3. #[derive(Debug)]
  4. struct Rectangle{
  5. width:u32,
  6. height:u32,
  7. }
  8. //impl 块将函数定义在上下文中
  9. impl Rectangle{
  10. //使用 &self 来替代 rectangle: &Rectangle,
  11. //因为该方法位于 impl Rectangle 上下文中
  12. //所以 Rust 知道 self 的类型是 Rectangle
  13. //加&表示不获取所有权,因为我们使用值就可以了
  14. //如果想修改里面的值就需要在self前加&mut,然后将
  15. //let rect1 改为let mut rect1
  16. fn area(&mut self) ->u32{
  17. self.width = 23;
  18. self.width*self.height
  19. }
  20. }
  21. fn main() {
  22. let mut rect1 = Rectangle{width:30,height:50};
  23. // {:#?}是比 {:?}风格优美的打印格式
  24. //println!("rec1 is {:#?}",rect1);
  25. // println!(
  26. // "The area of the rectangle is {} square pixels.",
  27. // area(&rect1)
  28. // );
  29. println!(
  30. "The area of the rectangle is {} square pixels.",
  31. rect1.area()
  32. )
  33. }
  34. //函数定义
  35. // fn area(rectangle: &Rectangle) ->u32{
  36. // rectangle.width*rectangle.height
  37. // }
  38. //方法定义,第一参数必须是self。

rust结构体的更多相关文章

  1. C语言——结构体

    struct 是一种把一些数据项组合在一起的数据结构.在Go,Rust这些新语言中都保留了结构体 struct 的概念,这是C的精华. 定义匿名结构体 例:学生信息定义为一个结构体,信息内容包括学生的 ...

  2. Go-常识补充-切片-map(类似字典)-字符串-指针-结构体

    目录 Go 常识补充 Go 命名 打印变量类型科普 _ 关键字 命名规范相关 包目录规范 切片 多维切片 切片初始化的方法 多维切片初始化 切片删除元素(会略微影响效率 ,少用) copy 函数 打散 ...

  3. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

  4. C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱

    一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...

  5. go语言结构体

    定义: 是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体. 成员: 每个值称为结构体的成员. 示例: 用结构体的经典案例处理公司的员工信息,每个员工信息包含一个唯一的员工编号.员工的名字. ...

  6. C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

  7. C++_系列自学课程_第_12_课_结构体

    #include <iostream> #include <string> using namespace std; struct CDAccount { double bal ...

  8. java socket传送一个结构体给用C++编写的服务器解析的问题

    另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组.解决方法:c++/c socket 在发送结构体的时候其实发送的也是字 ...

  9. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

随机推荐

  1. Redis基础用法

    Redis-避免缓存穿透的利器之BloomFilter Redis相关的问题的时候,经常提到BloomFilter(布隆过滤器)这玩意的使用场景是真的多,而且用起来是真的香,原理也好理解,看一下文章就 ...

  2. 从客户端中检测到有潜在危险的 Request.QueryString 值

    解决办法: 一.解决方法是在web.config的 里面加入<system.web> <pages validateRequest="false"/>< ...

  3. ORACLE ASMLIB

    ORACLE ASMLIB   This blog post is more of a note for myself on configuring ASMLib. ASMLib is an opti ...

  4. suoermap的object.net循环遍历属性表,从数据库取数据进行更新属性字段值

    /// </summary> /// <param name="sName">图层名</param> /// <param name=&q ...

  5. 使用Docker搭建Elasticsearch集群环境

    本篇文章首发于头条号单机如何搭建Elasticsearch集群?使用容器技术快速构建集群环境,欢迎关注头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_te ...

  6. day 04 作业 预科

    目录 作业 1.分别列出 数字类型.字符串类型.列表.字典 的 作用.定义方式和使用方法. 数字类型 字符串类型 列表 字典 词云图 作业 1.分别列出 数字类型.字符串类型.列表.字典 的 作用.定 ...

  7. Vi 和 Vim 编辑器详细使用方法

    学习linux的一项必会技能,熟练使用vi/vim编辑器那便最重要的了.不过一堆操作看的也是太头疼了,以下整理了些常用到的命令. 工作模式 vi编辑界面有三种不同的工作模式,分别为命令模式.输入模式. ...

  8. Linux无法被远程登录;用户的关机, 重启,注销,新增用户,删除用户

    不能使用xshell连接到我的Linux服务器 通过再windows的cmd中ping了我的Linux地址,发现网络不通. 查看百度发现是因为网络没有选桥接模式,然后选完桥接模式告诉我: 然后发现没有 ...

  9. docker动态修改端口映射(考虑生产环境)

    今天需要修改一个容器A的外部映射的端口,在宿主机上跑着许多容器,所以在解决这个问题的时候需要考虑两个硬性条件: 1.宿主机上docker的service服务本身不能重启,影响其他线上容器. 2.该容器 ...

  10. LeetCode - 24、两两交换链表中的节点

    给定一个链表,两两交换其中相邻的节点,并返回交换后的链表.你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, 你应该返回 2-> ...