Rust 结构体

Rust 结构体

数组用于表示一个同质值的集合。类似地,结构体是Rust中的另一种用户定义的数据类型,它允许我们将不同类型的数据项(包括另一个结构体)组合起来。结构体将数据定义为键值对。

语法 – 声明结构体

使用 struct 关键字来声明一个结构体。由于结构体是静态类型的,结构体中的每个字段都必须与一个数据类型关联。结构体的命名规则和约定与变量类似。结构体块必须以分号结束。

struct Name_of_structure {
   field1:data_type,
   field2:data_type,
   field3:data_type
}

语法 – 初始化结构体

在声明结构体后,每个字段都应赋予一个值。这被称为初始化。

let instance_name = Name_of_structure {
   field1:value1,
   field2:value2,
   field3:value3
}; 
//NOTE the semicolon
Syntax: Accessing values in a structure
Use the dot notation to access value of a specific field.
instance_name.field1
Illustration
struct Employee {
   name:String,
   company:String,
   age:u32
}
fn main() {
   let emp1 = Employee {
      company:String::from("TutorialsPoint"),
      name:String::from("Mohtashim"),
      age:50
   };
   println!("Name is :{} company is {} age is {}",emp1.name,emp1.company,emp1.age);
}

以上示例声明了一个名为Employee的结构体,它有三个字段-类型为name、company和age。main()函数初始化了这个结构体。它使用println!宏来打印结构体中定义的字段的值。

输出

Name is :Mohtashim company is TutorialsPoint age is 50

修改结构体实例

要修改一个实例,实例变量应标记为可变。下面的示例声明和初始化了一个名为 员工 的结构体,然后将 年龄 字段的值从50修改为40。

let mut emp1 = Employee {
   company:String::from("TutorialsPoint"),
   name:String::from("Mohtashim"),
   age:50
};
emp1.age = 40;
println!("Name is :{} company is {} age is 
{}",emp1.name,emp1.company,emp1.age);

输出

Name is :Mohtashim company is TutorialsPoint age is 40

将struct传递给函数

以下示例显示了如何将struct实例作为参数传递。display方法接受一个Employee实例作为参数,并打印详细信息。

fn display( emp:Employee) {
   println!("Name is :{} company is {} age is 
   {}",emp.name,emp.company,emp.age);
}

这是完整的程序−

//declare a structure
struct Employee {
   name:String,
   company:String,
   age:u32
}
fn main() {
   //initialize a structure
   let emp1 = Employee {
      company:String::from("TutorialsPoint"),
      name:String::from("Mohtashim"),
      age:50
   };
   let emp2 = Employee{
      company:String::from("TutorialsPoint"),
      name:String::from("Kannan"),
      age:32
   };
   //pass emp1 and emp2 to display()
   display(emp1);
   display(emp2);
}
// fetch values of specific structure fields using the 
// operator and print it to the console
fn display( emp:Employee){
   println!("Name is :{} company is {} age is 
   {}",emp.name,emp.company,emp.age);
}

输出

Name is :Mohtashim company is TutorialsPoint age is 50
Name is :Kannan company is TutorialsPoint age is 32

返回结构体从函数

让我们考虑一个函数 who_is_elder(),它比较两个员工的年龄并返回较年长的那个。

fn who_is_elder (emp1:Employee,emp2:Employee)->Employee {
   if emp1.age>emp2.age {
      return emp1;
   } else {
      return emp2;
   }
}

下面是完整的程序 –

fn main() {
   //initialize structure
   let emp1 = Employee{
      company:String::from("TutorialsPoint"),
      name:String::from("Mohtashim"),
      age:50
   };
   let emp2 = Employee {
      company:String::from("TutorialsPoint"),
      name:String::from("Kannan"),
      age:32
   };
   let elder = who_is_elder(emp1,emp2);
   println!("elder is:");

   //prints details of the elder employee
   display(elder);
}
//accepts instances of employee structure and compares their age
fn who_is_elder (emp1:Employee,emp2:Employee)->Employee {
   if emp1.age>emp2.age {
      return emp1;
   } else {
      return emp2;
   }
}
//display name, comapny and age of the employee
fn display( emp:Employee) {
   println!("Name is :{} company is {} age is {}",emp.name,emp.company,emp.age);
}
//declare a structure
struct Employee {
   name:String,
   company:String,
   age:u32
}

输出

elder is:
Name is :Mohtashim company is TutorialsPoint age is 50

结构体中的方法

方法就像函数一样,它们是一组逻辑上的编程指令。方法是用 fn 关键词声明的,其作用范围在结构体块内。

方法是在结构体块外声明的。使用 impl 关键词在结构体上下文中定义一个方法。方法的第一个参数总是表示结构体的调用实例的 self 。方法对结构体的数据成员进行操作。

要调用一个方法,我们需要先实例化结构体。然后可以使用结构体的实例调用该方法。

语法

struct My_struct {}
impl My_struct { 
   //set the method's context
   fn method_name() { 
      //define a method
   }
}

说明

以下示例定义了一个名为 Rectangle 的结构,其中包含字段 width 和 height 。在结构的上下文中定义了一个方法 area 。该方法通过 self 关键字访问结构的字段,并计算一个矩形的面积。

//define dimensions of a rectangle
struct Rectangle {
   width:u32, height:u32
}

//logic to calculate area of a rectangle
impl Rectangle {
   fn area(&self)->u32 {
      //use the . operator to fetch the value of a field via the self keyword
      self.width * self.height
   }
}

fn main() {
   // instanatiate the structure
   let small = Rectangle {
      width:10,
      height:20
   };
   //print the rectangle's area
   println!("width is {} height is {} area of Rectangle 
   is {}",small.width,small.height,small.area());
}

输出

width is 10 height is 20 area of Rectangle is 200

结构体中的静态方法

静态方法可以用作实用方法。 这些方法甚至在结构体实例化之前就存在。 静态方法使用结构体的名称调用,可以在没有实例的情况下访问。 与普通方法不同,静态方法不会使用&self参数。

语法 – 声明一个静态方法

一个静态方法可以像函数和其他方法一样,可以选择包含参数。

impl Structure_Name {
   //static method that creates objects of the Point structure
   fn method_name(param1: datatype, param2: datatype) -> return_type {
      // logic goes here
   }
}

语法 – 调用静态方法

structure_name :: 语法用于访问静态方法。

structure_name::method_name(v1,v2)

说明

以下示例使用getInstance方法作为一个工厂类,创建并返回结构Point的实例。

//declare a structure
struct Point {
   x: i32,
   y: i32,
}
impl Point {
   //static method that creates objects of the Point structure
   fn getInstance(x: i32, y: i32) -> Point {
      Point { x: x, y: y }
   }
   //display values of the structure's field
   fn display(&self){
      println!("x ={} y={}",self.x,self.y );
   }
}
fn main(){
   // Invoke the static method
   let p1 = Point::getInstance(10,20);
   p1.display();
}

输出

x =10 y=20

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程