Учебники

Ржавчина — Структура

Массивы используются для представления однородного набора значений. Аналогично, структура — это еще один определенный пользователем тип данных, доступный в 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 .