rust学习六、简单的struct结构

打印 上一主题 下一主题

主题 864|帖子 864|积分 2592

rust的struct结构体是一个不错的东西,不像java,后者在17版本左右才可用。
有许多语言都有类似的东西,比方pascal有record。
本文主要根据相干章节编写。
一、结构界说

struct-翻译为结构/结构体
总体上有两种界说方式:带有详细属性名的;不带属性名(元组)
从工程角度出发,并不推荐不带属性的界说方式,因为不友好。盼望rust后面不要搞类似似乎很友好,但是其实起到干扰作用的语法。
如果再思量到一些rust的别的问题,界说一个结构其实也不是那么容易。
示例:
  1. struct Point{x:f64,y:f64}
  2. struct Triangle(Point,Point,Point);
  3. /**
  4. * 家庭结构体s
  5. */
  6. struct Family {
  7.     name: String,
  8.     father: String,
  9.     mather: String,
  10.     children: Vec<String>,
  11. }
  12. /**
  13. * 这都什么狗屎语法。
  14. */
  15. struct Book<'a> {
  16.     name: &'a str,
  17.     author: &'a str,
  18.     price: f64,
  19.     pubyear: i32,
  20. }
  21. fn main() {
  22.     let mut family = Family {
  23.         name: String::from("家"),
  24.         father: String::from("爸爸"),
  25.         mather: String::from("妈妈"),
  26.         children: vec![],
  27.     };
  28.     family.children.push(String::from("老大-独龙"));
  29.     family.children.push(String::from("老二-独眼"));
  30.     family.children.push(String::from("老三-独秀"));
  31.     family.children.push(String::from("老四-嘟嘟"));
  32.     family.children.push(String::from("老五-杜牧"));
  33.     //打印家庭结构体
  34.     println!(
  35.         "家庭:{},父亲:{},母亲:{}",
  36.         family.name, family.father, family.mather
  37.     );
  38.     for child in &family.children {
  39.         println!("孩子:{}", child);
  40.     }
  41.     let mut 三国演义 = Book {
  42.         name: "三国演义",
  43.         author: "罗贯中",
  44.         price: 29.8,
  45.         pubyear: 1300,
  46.     };
  47.    
  48.     //各种创建结构实例的方式
  49.     // 方式一:双点号复制
  50.     let mut 红楼梦=Book{
  51.         name:"红楼梦",
  52.         author:"曹雪芹",
  53.         ..三国演义
  54.     };
  55.     //方式二: 略属性名
  56.     let 西游记=write_book("西游记","吴承恩",24.0,1525);
  57.     //方式三:使用基于元组定义的。 比java的record还简单
  58.     let books=[三国演义,红楼梦,西游记];
  59.     for i in 0..books.len() {
  60.         print_book(&books[i]);
  61.     }
  62.     let p1=Point{x:10.0,y:20.0};
  63.     let p2=Point{x:20.0,y:20.0};
  64.     let p3=Point{x:20.0,y:10.0};
  65.     let t=Triangle(p1,p2,p3);
  66.     print_triangle(&t);
  67. }
  68. fn print_book(book:&Book){
  69.     println!(
  70.         "书名:{},作者:{},价格:{},出版年:{}",
  71.         book.name, book.author, book.price, book.pubyear
  72.     );
  73. }
  74. fn print_triangle(t:&Triangle){
  75.     println!("三点坐标:");
  76.     println!("{},{}",t.0.x,t.0.y);
  77.     println!("{},{}",t.1.x,t.1.y);
  78.     println!("{},{}",t.2.x,t.2.y);
  79. }
  80. fn write_book<'a>(name:&'a str,author:&'a str,price:f64,pubyear:i32)->Book<'a>{
  81.     Book{
  82.         name,
  83.         author,
  84.         price,
  85.         pubyear
  86.     }
  87. }
复制代码
 二、几种打印方式

至少有4种打印方式:

  • 逐一访问属性名
  • println!使用宏符号:?
  • println!使用宏符号:#?
  • 使用dbg!
后面三种方式,要求界说结构的时候,在结构前添加
#[derive(Debug)]
这个东西应该怎么称谓了? "属性"还是"编译指示符"?,有点乱七八杂的。 从宏观上而言,很多类似的都是可以称为编译指示符,所以为了更加精准一些,我愿意称为"功能编译指示"。通过这个功能编译指示,rust编译器会自动实现特定功能。  示例:
  1. let mut 红楼梦=Book{
  2.         name:"红楼梦",
  3.         author:"曹雪芹",
  4.         ..三国演义
  5.     };
复制代码
 
三、界说结构内的函数

在没有看书本正文之前,我以为和java的record一样,在struct内部界说函数。
其实不是! 如果要为结构体界说函数,必须在结构体外。 不知道为什么要那样? 岂非内部界说的话,有别的用途?
示例:
  1. #[derive(Debug)]
  2. struct Family{
  3.     father:String,
  4.     mather:String,
  5.     address:String
  6. }
  7. fn main(){
  8.     let mut mf=Family{
  9.         father:String::from("lu"),
  10.         mather:String::from("hu"),
  11.         address:String::from("中国")
  12.     };
  13.     println!("我家-{},{},{}",mf.father,mf.mather,mf.address);
  14.     print_family(&mf);
  15.     print_family_use_dbg(&mf);
  16. }
  17. fn print_family(f:&Family){
  18.     //你不能直接打印,否则会有奇奇怪怪的错误提示
  19.     //println!("{}",f);  // 这个会提示错误,所以注释掉了
  20.     //使用奇怪符号 :?打印结构体
  21.     println!("我家:?-{:?}",f);
  22.     //使用奇怪的符号,可以打印结构体 :#?
  23.     println!("我家:#?-{:#?}",f);
  24. }
  25. fn print_family_use_dbg(f:&Family){
  26.     dbg!(f);
  27. }
复制代码
 
结构体的函数有几个特点:

  • 在结构体外,使用impl xxxx {}的方式,此中xxx是结构体名称
  • 在一个impl xxx{}结构中,可以界说多个函数
  • 书本发起我们:函数的第一个方法总是 &self,这点和python有点类似
  • 参数&self虽然有界说,但是调用的时候不须要表现传递,因为这是编译器实现的
 
四、小结

结构体无疑是一个有用的东西,它就算垃圾袋/宝贝袋一样,什么都可以往里装,大大方便了工程师!
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表