Массивы используются для представления однородного набора значений. Аналогично, структура — это еще один определенный пользователем тип данных, доступный в 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 с тремя полями — имя, компания и возраст типов. Функция main () инициализирует структуру. Он использует println! макрос для печати значений полей, определенных в структуре.
Выход
Name is :Mohtashim company is TutorialsPoint age is 50
Изменение экземпляра структуры
Чтобы изменить экземпляр, переменная экземпляра должна быть помечена как изменяемая. В приведенном ниже примере объявляется и инициализируется структура с именем Employee, а затем изменяется значение поля age до 40 с 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);
Выход
Name is :Mohtashim company is TutorialsPoint age is 40
Передача структуры в функцию
В следующем примере показано, как передать экземпляр структуры в качестве параметра. Метод 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 с полями — ширина и высота . Область метода определяется в контексте структуры. Метод 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::method_name(v1,v2)
иллюстрация
В следующем примере метод getInstance используется в качестве фабричного класса, который создает и возвращает экземпляры структуры Point .