Учебники

Rust — String

Тип данных String в Rust можно классифицировать на следующие:

  • Строковый литерал (& str)

  • String Object (Строка)

Строковый литерал (& str)

String Object (Строка)

Строковый литерал

Строковые литералы (& str) используются, когда значение строки известно во время компиляции. Строковые литералы — это набор символов, которые жестко закодированы в переменную. Например, пусть company = «Tutorials Point» . Строковые литералы находятся в модуле std :: str. Строковые литералы также известны как строковые фрагменты.

В следующем примере объявляются два строковых литерала — компания и местоположение .

fn main() {
   let company:&str="TutorialsPoint";
   let location:&str = "Hyderabad";
   println!("company is : {} location :{}",company,location);
}

Строковые литералы являются статическими по умолчанию. Это означает, что строковые литералы гарантированно будут действительны в течение всей программы. Мы также можем явно указать переменную как статическую, как показано ниже —

fn main() {
   let company:&'static str = "TutorialsPoint";
   let location:&'static str = "Hyderabad";
   println!("company is : {} location :{}",company,location);
}

Вышеуказанная программа сгенерирует следующий вывод —

company is : TutorialsPoint location :Hyderabad

String Object

Тип объекта String предоставляется в стандартной библиотеке. В отличие от строкового литерала, тип строкового объекта не является частью основного языка. Он определен как публичная структура в стандартной библиотеке pub struct String . String — это растущая коллекция. Это изменчивый тип UTF-8. Тип объекта String может использоваться для представления строковых значений, которые предоставляются во время выполнения. Строковый объект размещается в куче.

Синтаксис

Чтобы создать объект String, мы можем использовать любой из следующих синтаксисов:

String::new()

Приведенный выше синтаксис создает пустую строку

String::from()

Это создает строку с некоторым значением по умолчанию, переданным в качестве параметра методу from () .

Следующий пример иллюстрирует использование объекта String.

fn main(){
   let empty_string = String::new();
   println!("length is {}",empty_string.len());

   let content_string = String::from("TutorialsPoint");
   println!("length is {}",content_string.len());
}

В приведенном выше примере создаются две строки — пустой строковый объект с использованием нового метода и строковый объект из строкового литерала с использованием метода from .

Вывод как показано ниже —

length is 0
length is 14

Общие методы — String Object

Sr.No. метод Подпись Описание
1 новый () pub const fn new () → Строка Создает новую пустую строку.
2 нанизывать() fn to_string (& self) → String Преобразует данное значение в строку.
3 заменить () pub fn replace <‘a, P> (&’ a self, from: P, to: & str) → String Заменяет все совпадения шаблона другой строкой.
4 as_str () паб fn as_str (& self) → & str Извлекает фрагмент строки, содержащий всю строку.
5 От себя() паб fn push (& mut self, ch: char) Добавляет указанный символ в конец этой строки.
6 push_str () pub fn push_str (& mut self, string: & str) Добавляет данный фрагмент строки в конец этой строки.
7 LEN () паб fn len (& self) → usize Возвращает длину этой строки в байтах.
8 отделка() Паб fn trim (& self) → & str Возвращает фрагмент строки с удаленными начальными и конечными пробелами.
9 split_whitespace () pub fn split_whitespace (& self) → SplitWhitespace Разбивает фрагмент строки по пробелам и возвращает итератор.
10 Трещина() pub fn split <‘a, P> (&’ a self, pat: P) → Split <‘a, P>, где P — это шаблон, который может быть & str, char или замыканием, определяющим разделение. Возвращает итератор для подстрок этого среза строки, разделенных символами, соответствующими шаблону.
11 символы () паб fn chars (& self) → Чарс Возвращает итератор для символов фрагмента строки.

Иллюстрация: новый ()

Пустой строковый объект создается с использованием метода new (), и его значение устанавливается в hello .

fn main(){
   let mut z = String::new();
   z.push_str("hello");
   println!("{}",z);
}

Выход

Вышеуказанная программа генерирует следующий вывод —

hello

Иллюстрация: to_string ()

Чтобы получить доступ ко всем методам объекта String, преобразуйте строковый литерал в тип объекта с помощью функции to_string () .

fn main(){
   let name1 = "Hello TutorialsPoint , 
   Hello!".to_string();
   println!("{}",name1);
}

Выход

Вышеуказанная программа генерирует следующий вывод —

Hello TutorialsPoint , Hello!

Иллюстрация: заменить ()

Функция replace () принимает два параметра: первый параметр — это строковый шаблон для поиска, а второй параметр — новое значение, которое необходимо заменить. В приведенном выше примере Hello появляется два раза в строке name1 .

Функция replace заменяет все вхождения строки Hello на Howdy .

fn main(){
   let name1 = "Hello TutorialsPoint , 
   Hello!".to_string();         //String object
   let name2 = name1.replace("Hello","Howdy");    //find and replace
   println!("{}",name2);
}

Выход

Вышеуказанная программа генерирует следующий вывод —

Howdy TutorialsPoint , Howdy!

Иллюстрация: as_str ()

Функция as_str () извлекает фрагмент строки, содержащий всю строку.

fn main() {
   let example_string = String::from("example_string");
   print_literal(example_string.as_str());
}
fn print_literal(data:&str ){
   println!("displaying string literal {}",data);
}

Выход

Вышеуказанная программа генерирует следующий вывод —

displaying string literal example_string

Иллюстрация: push ()

Функция push () добавляет указанный символ в конец этой строки.

fn main(){
   let mut company = "Tutorial".to_string();
   company.push('s');
   println!("{}",company);
}

Выход

Вышеуказанная программа генерирует следующий вывод —

Tutorials

Иллюстрация: push_str ()

Функция push_str () добавляет данный фрагмент строки в конец строки.

fn main(){
   let mut company = "Tutorials".to_string();
   company.push_str(" Point");
   println!("{}",company);
}

Выход

Вышеуказанная программа генерирует следующий вывод —

Tutorials Point

Иллюстрация: len ()

Функция len () возвращает общее количество символов в строке (включая пробелы).

fn main() {
   let fullname = " Tutorials Point";
   println!("length is {}",fullname.len());
}

Выход

Вышеуказанная программа генерирует следующий вывод —

length is 20

Иллюстрация: отделка ()

Функция trim () удаляет начальные и конечные пробелы в строке. Обратите внимание, что эта функция не удалит встроенные пробелы.

fn main() {
   let fullname = " Tutorials Point \r\n";
   println!("Before trim ");
   println!("length is {}",fullname.len());
   println!();
   println!("After trim ");
   println!("length is {}",fullname.trim().len());
}

Выход

Вышеуказанная программа генерирует следующий вывод —

Before trim
length is 24

After trim
length is 15

Иллюстрация: split_whitespace ()

Split_whitespace () разбивает входную строку на разные строки. Он возвращает итератор, поэтому мы перебираем токены, как показано ниже —

fn main(){
   let msg = "Tutorials Point has good t
   utorials".to_string();
   let mut i = 1;
   
   for token in msg.split_whitespace(){
      println!("token {} {}",i,token);
      i+=1;
   }
}

Выход

token 1 Tutorials
token 2 Point
token 3 has
token 4 good
token 5 tutorials

Иллюстрация: строка split ()

Метод строки split () возвращает итератор для подстрок фрагмента строки, разделенных символами, соответствующими шаблону. Ограничение метода split () состоит в том, что результат не может быть сохранен для дальнейшего использования. Метод collect может использоваться для хранения результата, возвращаемого split (), как вектора.

fn main() {
   let fullname = "Kannan,Sudhakaran,Tutorialspoint";

   for token in fullname.split(","){
      println!("token is {}",token);
   }

   //store in a Vector
   println!("\n");
   let tokens:Vec<&str>= fullname.split(",").collect();
   println!("firstName is {}",tokens[0]);
   println!("lastname is {}",tokens[1]);
   println!("company is {}",tokens[2]);
}

Приведенный выше пример разбивает строку на полное имя всякий раз, когда встречается запятая (,) .

Выход

token is Kannan
token is Sudhakaran
token is Tutorialspoint

firstName is Kannan
lastname is Sudhakaran
company is Tutorialspoint

Иллюстрация: символы ()

Отдельные символы в строке могут быть доступны с помощью метода chars. Давайте рассмотрим пример, чтобы понять это.

fn main(){
   let n1 = "Tutorials".to_string();

   for n in n1.chars(){
      println!("{}",n);
   }
}

Выход

T
u
t
o
r
i
a
l
s

Конкатенация строк с оператором +

Строковое значение может быть добавлено к другой строке. Это называется конкатенацией или интерполяцией. Результатом конкатенации строк является новый строковый объект. Оператор + внутренне использует метод add . Синтаксис функции add принимает два параметра. Первый параметр self — сам строковый объект, а второй параметр — ссылка на второй строковый объект. Это показано ниже —

//add function
add(self,&str)->String { 
   // returns a String object
}

Иллюстрация: Конкатенация строк

fn main(){
   let n1 = "Tutorials".to_string();
   let n2 = "Point".to_string();

   let n3 = n1 + &n2; // n2 reference is passed
   println!("{}",n3);
}

Выход будет как указано ниже

TutorialsPoint

Иллюстрация: Тип литья

В следующем примере показано преобразование числа в строковый объект —

fn main(){
   let number = 2020;
   let number_as_string = number.to_string(); 
   
   // convert number to string
   println!("{}",number_as_string);
   println!("{}",number_as_string=="2020");
}

Выход будет как указано ниже

2020
true

Иллюстрация: формат! макрос

Еще один способ добавить к объектам String вместе — это использовать макро-функцию, называемую format. Использование формата! как показано ниже.

fn main(){
   let n1 = "Tutorials".to_string();
   let n2 = "Point".to_string();
   let n3 = format!("{} {}",n1,n2);
   println!("{}",n3);
}

Выход будет как указано ниже