前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >21.Rust-结构体

21.Rust-结构体

原创
作者头像
面向加薪学习
修改2022-09-04 11:39:25
3490
修改2022-09-04 11:39:25
举报
文章被收录于专栏:面向加薪学习面向加薪学习

结构体( struct 可以由各种不同类型组成。使用 struct 关键字来创建。structstructure 的缩写。结构体可以作为另一个结构体的字段。结构体是可以嵌套的。

元组结构体(tuple struct),事实上就是具名元组而已。

代码语言:rust
复制
struct Pair(String, i32);
  • 经典的 C 语言风格结构体(C struct)。
代码语言:rust
复制
    struct 结构体名称 {
        ...
    }
  • 单元结构体(unit struct),不带字段,在泛型中很有用。 struct Unit;

定义结构体

代码语言:txt
复制
struct 结构体名称 {
    字段1:数据类型,
    字段2:数据类型,
    ...
}

创建结构体实例

代码语言:txt
复制
let 实例名称 = 结构体名称{
    field1:value1,
    field2:value2
    ...
};

结构体初始化,其实就是对 结构体中的各个元素进行赋值

代码语言:txt
复制
#[derive(Debug)]
struct Study {
    name: String,
    target: String,
    spend: i32,
}

fn main() {
    let s = Study {
        name: String::from("从0到Go语言微服务架构师"),
        target: String::from("全面掌握Go语言微服务落地,代码级一次性解决微服务和分布式系统。"),
        spend: 3,
    };
    println!("{:?}", s);
    //输出 Study { name: "从0到Go语言微服务架构师", target: "全面掌握Go语言微服务落地,代码级一次性解决微服务和分布式系统。", spend: 3 }
}

访问实例属性

代码语言:txt
复制
实例名称.属性

println!("{}",s.name);//输出 从0到Go语言微服务架构师

修改结构体实例

结构体实例默认是不可修改的,如果想修改结构体实例,声明时使用mut关键字。

代码语言:txt
复制
let mut s2 = Study {
        name: String::from("从0到Go语言微服务架构师"),
        target: String::from("全面掌握Go语言微服务落地,代码级一次性解决微服务和分布式系统。"),
        spend: 3,
    };
 s2.spend=7;
 println!("{:?}",s2);//输出 Study { name: "从0到Go语言微服务架构师", target: "全面掌握Go语言微服务落地,代码级一次性解决微服务和分布式系统。", spend: 7 }

结构体做参数

代码语言:txt
复制
fn show(s: Study) {
    println!(
        "name is :{} target is {} spend is{}",
        s.name, s.target, s.spend
    );
}

结构体作为返回值

代码语言:txt
复制
fn get_instance(name: String, target: String, spend: i32) -> Study {
    return Study {
        name,
        target,
        spend,
    };
}

let s3 = get_instance(
    String::from("Go语言极简一本通"),
    String::from("学习Go语言语法,并且完成一个单体服务"),
    5,
);
println!("{:?}", s3);
//输出 Study { name: "Go语言极简一本通", target: "学习Go语言语法,并且完成一个单体服务", spend: 5 }

方法

方法(method)是依附于对象的函数。这些方法通过关键字 self 来访问对象中的数据和其他。方法在 impl 代码块中定义。

与函数的区别 函数:可以直接调用,同一个程序不能出现 2 个相同的函数签名的函数,应为函数不归属任何 owner。 方法:归属某一个 owner,不同的 owner 可以有相同的方法签名。

代码语言:定义方法
复制
impl 结构体{
    fn 方法名(&self,参数列表) 返回值 {
        //方法体
    }
}

impl 是 implement 的缩写。意思是 “实现”的意思。

self 是“自己”的意思,&self 表示当前结构体的实例。 &self 也是结构体普通方法固定的第一个参数,其他参数可选。

结构体方法的作用域仅限于结构体内部。

代码语言:txt
复制
impl Study {
    fn get_spend(&self) -> i32 {
        return self.spend;
    }
}

println!("spend {}", s3.get_spend());
//输出 spend 5

结构体静态方法

代码语言:txt
复制
fn 方法名(参数: 数据类型,...) -> 返回值类型 {
      // 方法体
   }

调用方式
结构体名称::方法名(参数列表)
代码语言:txt
复制
impl Study {
    ...
    fn get_instance_another(name: String, target: String, spend: i32) -> Study {
        return Study {
            name,
            target,
            spend,
        };
    }
}

let s4 = Study::get_instance_another(
    String::from("Go语言极简一本通"),
    String::from("学习Go语言语法,并且完成一个单体服务"),
    5,
);

单元结构体

unit type 是一个类型,有且仅有一个值:(),单元类型()类似 c/c++/java 语言中的 void。当一个函数并不需要返回值的时候,rust 则返回()。但语法层面上,void 仅仅只是一个类型,该类型没有任何值;而单元类型()既是一个类型,同时又是该类型的值。

实例化一个元组结构体

代码语言:txt
复制
    let pair = (String::from("从0到Go语言微服务架构师"), 1);

访问元组结构体的字段

代码语言:txt
复制
    println!("pair 包含 {:?} and {:?}", pair.0, pair.1);

解构一个元组结构体

代码语言:txt
复制
    let (study, spend) = pair;
    println!("pair contains {:?} and {:?}", study, spend);

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义结构体
  • 创建结构体实例
  • 访问实例属性
  • 修改结构体实例
  • 结构体做参数
  • 结构体作为返回值
  • 方法
  • 结构体静态方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档