Rust - Cấu trúc
Mảng được sử dụng để biểu thị một tập hợp các giá trị đồng nhất. Tương tự, một cấu trúc là một kiểu dữ liệu do người dùng định nghĩa khác có sẵn trong Rust cho phép chúng ta kết hợp các mục dữ liệu thuộc các kiểu khác nhau, bao gồm cả một cấu trúc khác. Một cấu trúc xác định dữ liệu là một cặp khóa-giá trị.
Cú pháp - Khai báo cấu trúc
Các struct từ khóa được sử dụng để khai báo một cấu trúc. Vì cấu trúc được định kiểu tĩnh nên mọi trường trong cấu trúc phải được liên kết với một kiểu dữ liệu. Các quy tắc và quy ước đặt tên cho một cấu trúc giống như của một biến. Khối cấu trúc phải kết thúc bằng dấu chấm phẩy.
struct Name_of_structure {
field1:data_type,
field2:data_type,
field3:data_type
}
Cú pháp - Khởi tạo cấu trúc
Sau khi khai báo một cấu trúc, mỗi trường sẽ được gán một giá trị. Điều này được gọi là khởi tạo.
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);
}
Ví dụ trên khai báo một struct Employee với ba trường - tên, công ty và tuổi của các loại. Main () khởi tạo cấu trúc. Nó sử dụng println! macro để in giá trị của các trường được xác định trong cấu trúc.
Đầu ra
Name is :Mohtashim company is TutorialsPoint age is 50
Sửa đổi một phiên bản cấu trúc
Để sửa đổi một phiên bản, biến phiên bản phải được đánh dấu là có thể thay đổi được. Ví dụ dưới đây khai báo và khởi tạo cấu trúc có tên Employee và sau đó sửa đổi giá trị của trường age thành 40 từ 50.
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);
Đầu ra
Name is :Mohtashim company is TutorialsPoint age is 40
Truyền một cấu trúc cho một hàm
Ví dụ sau đây cho thấy cách chuyển thể hiện của struct dưới dạng tham số. Phương thức hiển thị lấy một cá thể Employee làm tham số và in các chi tiết.
fn display( emp:Employee) {
println!("Name is :{} company is {} age is
{}",emp.name,emp.company,emp.age);
}
Đây là chương trình hoàn chỉnh -
//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);
}
Đầu ra
Name is :Mohtashim company is TutorialsPoint age is 50
Name is :Kannan company is TutorialsPoint age is 32
Trả về cấu trúc từ một hàm
Chúng ta hãy xem xét một hàm who_is_elder () , so sánh tuổi của hai nhân viên và trả về tuổi của nhân viên.
fn who_is_elder (emp1:Employee,emp2:Employee)->Employee {
if emp1.age>emp2.age {
return emp1;
} else {
return emp2;
}
}
Đây là chương trình hoàn chỉnh -
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
}
Đầu ra
elder is:
Name is :Mohtashim company is TutorialsPoint age is 50
Phương pháp trong cấu trúc
Các phương thức giống như các hàm. Chúng là một nhóm các hướng dẫn lập trình hợp lý. Các phương thức được khai báo vớifntừ khóa. Phạm vi của một phương thức nằm trong khối cấu trúc.
Các phương thức được khai báo bên ngoài khối cấu trúc. Cácimpltừ khóa được sử dụng để xác định một phương thức trong ngữ cảnh của một cấu trúc. Tham số đầu tiên của một phương thức sẽ luôn làself, đại diện cho phiên bản gọi của cấu trúc. Các phương thức hoạt động trên các thành viên dữ liệu của một cấu trúc.
Để gọi một phương thức, trước tiên chúng ta cần khởi tạo cấu trúc. Phương thức có thể được gọi bằng cách sử dụng thể hiện của cấu trúc.
Cú pháp
struct My_struct {}
impl My_struct {
//set the method's context
fn method_name() {
//define a method
}
}
Hình minh họa
Ví dụ sau định nghĩa cấu trúc Hình chữ nhật với các trường - chiều rộng và chiều cao . Một vùng phương thức được xác định trong ngữ cảnh của cấu trúc. Phương thức area truy cập các trường của cấu trúc thông qua từ khóa self và tính diện tích hình chữ nhật.
//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());
}
Đầu ra
width is 10 height is 20 area of Rectangle is 200
Phương pháp tĩnh trong cấu trúc
Các phương thức tĩnh có thể được sử dụng như các phương thức tiện ích. Các phương thức này tồn tại ngay cả trước khi cấu trúc được khởi tạo. Các phương thức tĩnh được gọi bằng cách sử dụng tên của cấu trúc và có thể được truy cập mà không cần thể hiện. Không giống như các phương thức bình thường, một phương thức tĩnh sẽ không nhận tham số & self .
Cú pháp - Khai báo một phương thức tĩnh
Một phương thức tĩnh giống như các hàm và các phương thức khác có thể tùy chọn chứa các tham số.
impl Structure_Name {
//static method that creates objects of the Point structure
fn method_name(param1: datatype, param2: datatype) -> return_type {
// logic goes here
}
}
Cú pháp - Gọi một phương thức tĩnh
Các structure_name :: cú pháp được sử dụng để truy cập vào một phương pháp tĩnh.
structure_name::method_name(v1,v2)
Hình minh họa
Ví dụ sau sử dụng phương thức getInstance như một lớp nhà máy tạo và trả về các thể hiện của cấu trúc 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();
}
Đầu ra
x =10 y=20