Практический курс изучения Rust (2) — Основы

задняя часть Rust
Практический курс изучения Rust (2) — Основы

ввод, вывод

Как и в C++, есть стандартный ввод и вывод:

use std::io::stdin;

fn main() {
    println!("你好,你叫什么名字?");
    let mut your_name = String::new();
    stdin()
        .read_line(&mut your_name)
        .expect("Failed to read line");
    println!("你好,{}", your_name)
}

Если у вас есть опыт разработки или вы что-то знаете о C++, вы не сможете понять этот код.Одним предложением: используйте стандартныйstd::io::stdinВвод метода такой, а затем содержимое сохраняется в переменнойyour_nameвводить, читать и добавлять сообщение об исключении в концеexpect.

По поводу написания этой цепочки, поясняется в статье:

Подобное объединение функций называется цепочкой функций. Начиная сверху, каждая функция передает свои результаты следующей функции. Обычно цепочку функций форматируют так, чтобы каждый шаг в ее строке имел отступ, чтобы указать, что блок принадлежит друг другу.

function

Оберните приведенный выше код в функцию:

use std::io::stdin;

fn what_is_your_name() -> String {
    let mut your_name = String::new();
    stdin()
        .read_line(&mut your_name)
        .expect("Failed to read line");
    your_name
}
fn main() {
    println!("你好,你叫什么名字?");
    let name = what_is_your_name();
    println!("你好,{}", name);
}

Среди них особое отличие состоит в том, что возврат в функцию можно записать напрямуюyour_name, опущеноreturnи точка с запятой, это интересно.

Эта строка не заканчивается точкой с запятой. Это сокращение для возврата в Rust. Таким образом может возвращаться любое выражение. Это то же самое, что и при вводе return your_name;. Clippy будет жаловаться, если вы наберете return, когда он вам не нужен.

Array

Существует два правила определения массива:

  1. Тип данных непротиворечив;
  2. Длина массива не меняется

Методы и формы определения массивов и вспомогательных массивов аналогичны другим языкам и не нуждаются в объяснении, например:

let visitor_list = ["叶梅树", "叶帅", "叶哥"];

println!("第一种遍历方法");
for  i in 0..visitor_list.len() {
    println!("{}", visitor_list[i]);
}

println!("第二种遍历方法");
for visitor in &visitor_list {
    println!("{}", visitor);
}

Structs

разговорный язык: структура

Среди них вышеперечисленные мы использовалиStringа такжеStdInОба являются структурными типами.

Мы можем определить структуру, а затем наследовать эту структуру и написать соответствующий метод структуры, что чем-то похоже на способ написания Swift.

Например, мы определяемVisitorСтруктура:

// 定义一个结构体
struct Visitor {
    name: String,
    greeting: String,
}

// 编写继承函数
impl Visitor {
    fn new(name: &str, greeting: &str) -> Self {
        Self {
            name: name.to_lowercase(),
            greeting: greeting.to_string(),
        }
    }

    fn greet_visitor(&self) {
        println!("{}", self.greeting);
    }
}

использовать:

use std::io::stdin;

fn what_is_your_name() -> String {
    let mut your_name = String::new();
    stdin()
        .read_line(&mut your_name)
        .expect("Failed to read line");
    your_name
}

// 定义一个结构体
struct Visitor {
    name: String,
    greeting: String,
}

// 编写继承函数
impl Visitor {
    fn new(name: &str, greeting: &str) -> Self {
        Self {
            name: name.to_string(),
            greeting: greeting.to_string(),
        }
    }

    fn greet_visitor(&self) {
        println!("{}", self.greeting);
    }
}

fn main() {
    
    let visitor_list = [
        Visitor::new("bert", "Hello Bert, enjoy your treehouse."),
        Visitor::new("steve", "Hi Steve. Your milk is in the fridge."),
        Visitor::new("fred", "Wow, who invited Fred?"),
    ];

    println!("你好,你叫什么名字?");   
    let name = what_is_your_name();

    let known_visitor = visitor_list
        .iter()
        .find(|visitor| visitor.name == name);

    match known_visitor {
        Some(visitor) => visitor.greet_visitor(),
        None => println!("不在列表之内")
    }
}

Vectors

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

Другие методы использования аналогичны и не будут здесь описываться.

Enumerations

Это использование аналогично, нет никакой разницы, и метод использования будет описан в процессе будущего использования.

enum VisitorAction {
    Accept,
    AcceptWithNote { note: String },
    Refuse,
    Probation,
}

здесь,AcceptWithNodte { note: String }Когда вы используете его, вы можете настроить использование переменных.

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