📜  Rust——结构的概念

📅  最后修改于: 2022-05-13 01:54:46.602000             🧑  作者: Mango

Rust——结构的概念

结构基本上是用户定义的类型,主要用于将不同的数据类型组合在一起。它克服了传统数组只能包含相同数据类型元素的限制。一个结构本身也可以包含一个结构。在 Rust 中,结构类似于元组,但结构元素很容易访问,因为在元组的情况下它们被命名而不是索引。

在 Rust 中,结构分为三种类型

  • 典型的 C 类结构
  • 元组结构:它类似于元组,其中字段未命名但具有附加功能。
  • 单元结构:这些是无字段结构,即不包含数据。在我们只想在某些类型上实现 trait 但没有数据的情况下,它很有用。

如何定义结构?

结构由 struct 关键字后跟密钥对元素定义。

Rust
// typical c struct
struct Student{
name:String,
roll: u64,
dept: String,
}
  
// A unit struct
struct Unit;
  
// A tuple struct
struct Pair(i32, f32);


Rust
#[derive(Debug)]
struct Student{
name:String,
roll: u64,
dept: String,
}
  
fn main() {
   let student1 = Student{
        name: String::from("Prem"),
        roll: 50,
        dept:String::from("CSE"),
    };
    println!("{:?}",student1.name);
}


Rust
#[derive(Debug)]
struct Student{
name:String,
roll: u64,
dept: String,
}
  
fn main() {
   let mut student1 = Student{
        name: String::from("Prem"),
        roll: 50,
        dept:String::from("CSE"),
    };
  student1.roll=60;
    println!("{:?}",student1.roll);
}


Rust
#[derive(Debug)]
struct Addr{
  loc:String,
  pin:u64,
}
struct Student{
name:String,
roll: u64,
dept: String,
addr: Addr,
}
  
fn main() {
  let add1=Addr{
    loc: String::from("world"),
    pin:700001,
  };
   let student1 = Student{
        name: String::from("Prem"),
        roll: 50,
        dept:String::from("CSE"),
        addr:add1,
    };
    println!("{:?}",student1.addr.pin);
}


Rust
#[derive(Debug)]
struct Triangle {
    base: f64,
    height: f64,
}
  
impl Triangle {
    fn area(&self) -> f64 {
        self.base * self.height * 0.5
    }
}
  
fn main() {
    let tri1 = Triangle {
        base: 3.0,
        height: 5.0,
    };
  
    println!("The area of the triangle is = {}",tri1.area());
}


在这里,我们使用 struct 关键字及其元素——“name”、“roll”和“dept”以及它们预期的数据类型定义了一个 Student 结构。我们还定义了单元结构和元组结构。当我们定义结构时,没有分配内存给它。只有当我们初始化它时,它才会被分配。



现在,我们将初始化我们的 Student 结构。使用“.”访问结构元素。 (点)运算符。

#[derive(Debug)]
struct Student{
name:String,
roll: u64,
dept: String,
}
  
fn main() {
   let student1 = Student{
        name: String::from("Prem"),
        roll: 50,
        dept:String::from("CSE"),
    };
    println!("{:?}",student1.name);
}

输出:

"Prem"

更新已定义结构的值

由于我们想要更新一个结构的值,所以我们用来初始化它的变量,即上面例子中的 student1 应该声明为 mut(一个可以更新的变量),否则默认情况下它是不可变的(不能更新)。

#[derive(Debug)]
struct Student{
name:String,
roll: u64,
dept: String,
}
  
fn main() {
   let mut student1 = Student{
        name: String::from("Prem"),
        roll: 50,
        dept:String::from("CSE"),
    };
  student1.roll=60;
    println!("{:?}",student1.roll);
}

输出:

60

嵌套结构

如前所述,我们可以在另一个结构中使用一个结构。让我们来看看。

#[derive(Debug)]
struct Addr{
  loc:String,
  pin:u64,
}
struct Student{
name:String,
roll: u64,
dept: String,
addr: Addr,
}
  
fn main() {
  let add1=Addr{
    loc: String::from("world"),
    pin:700001,
  };
   let student1 = Student{
        name: String::from("Prem"),
        roll: 50,
        dept:String::from("CSE"),
        addr:add1,
    };
    println!("{:?}",student1.addr.pin);
}

输出:

700001

这里我们尝试将地址结构添加到学生结构中。需要注意的一件事是 addr 结构应该在 student 结构之前定义,在初始化期间也是如此。请注意用于访问作为另一个结构的一部分的结构的元素的方法。为此,我们在 student1.addr.pin 中使用了两次点运算符。

定义结构的方法

#[derive(Debug)]
struct Triangle {
    base: f64,
    height: f64,
}
  
impl Triangle {
    fn area(&self) -> f64 {
        self.base * self.height * 0.5
    }
}
  
fn main() {
    let tri1 = Triangle {
        base: 3.0,
        height: 5.0,
    };
  
    println!("The area of the triangle is = {}",tri1.area());
}

输出:

The area of the triangle is = 7.5

我们启动了一个 impl(实现)块,在其中定义了三角形的方法区。我们将结构体实例的地址传递给函数并使用 self 来引用它。