21.Rust-结构体

2022-09-04 11:39:25 浏览数 (1)

结构体( 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);

0 人点赞