Функции ржавчины

Rust

Rust поддерживает множество парадигм программирования, но он более функционален: функции в Rust являются «гражданами первого класса», и функции могут передаваться в программе как данные. Подобно C и C++, Rust также имеет уникальную запись программыmainфункция.

Пример: Запись программыmainфункция

fn main() {
    println!("Hello, world!");
}

Ржавчина используетfnключевые слова для объявления и определения функций, используйтеsnake caseстиль для именования функций, то есть все буквы в нижнем регистре и используют символы подчеркивания для разделения слов. Функции могут иметь параметры, и каждая функция имеет возвращаемое значение.

параметр функции

Метод объявления параметра: имя параметра + двоеточие + тип параметра

Пример:

// 定义一个无参函数
fn function() {
    println!("A function with no parameters.");
}

// 定义一个有参函数
fn hello(name: &str) {
  println!("Hello, {}.", name);
}

Функция возвращаемого значения

В Rust все функции имеют возвращаемые значения.mainФункции не исключение,mainВозвращаемое значение функции равно()(пустой кортеж). В Rust, когда функция возвращает(), объявление типа возвращаемого значения можно опустить.mainПолная форма функции выглядит следующим образом:

  fn main() -> () {
    //statements
  }

()обычно называется какunitилиunit type, который на самом деле похож на тип void в C/C++, Java и C#.

Если функция имеет другие типы возвращаемых значений, вам нужно использовать->Явно укажите тип возвращаемого значения. Такие языки, как C/C++ или Java, необходимо использовать в функцияхreturnВ отличие от них, где операторы возвращают значение, Rust по умолчанию использует в качестве возвращаемого значения результат последнего выражения в функции.

Пример: определить функцию с возвращаемым значением

fn main() {
    let x = plus_one(5);

    println!("The value of x is: {}", x);
}

fn plus_one(x: i32) -> i32 {
    x + 1
}

У ржавчины тоже естьreturnключевое слово, но обычно используется для раннего возврата.

Пример: используется в функцииreturn

fn main() {
  let a = [1,3,2,5,9,8];
  println!("There is 7 in the array: {}", find(7, &a));
  println!("There is 8 in the array: {}", find(8, &a));
}
fn find(n: i32, a: &[i32]) -> bool {
  for i in a {
    if *i == n {
      return true;
    }
  }
  false // 这里也可以改为 `return false;`,但这就不是 Rust 的编程风格了
}

В Rust также есть функция «без возвращаемого значения», называемаяФункция расхождения(расходящаяся функция). На самом деле, он вообще не возвращается, он использует восклицательный знак!как возвращаемый тип.

Пример:

fn main() {
  println!("hello");
  diverging();
  println!("world");
}
fn diverging() -> ! {
  panic!("This function will never return");
}

Функция дивергенции, как правило,panic!Вызов макроса или другой вызов другой расходящейся функции завершается, поэтому вызов расходящейся функции приведет к сбою текущего потока.

Функции высшего порядка

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

тип указателя функции

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

Пример:

// 函数定义
fn inc(n: i32) -> i32 {
    n + 1
}

// 使用 `type` 给函数指针类型起一个别名
type IncType = fn(i32) -> i32;

fn main() {
    // 使用函数指针类型 `fn(i32) -> i32`
    let func: fn(i32) -> i32 = inc;
    println!("3 + 1 = {}", func(3));

    // 使用函数指针类型的别名 `IncType`
    let func: IncType = inc;
    println!("4 + 1 = {}", func(4));
}

функция как параметр

Функции в качестве параметров объявляются как обычные параметры.

Пример: функции высшего порядка

fn main() {
  println!("3 + 1 = {}", process(3, inc));
  println!("3 - 1 = {}", process(3, dec));
}
fn inc(n: i32) -> i32 {
  n + 1
}
fn dec(n: i32) -> i32 {
  n - 1
}
// process 是一个高阶函数,它有两个参数,一个类型为 `i32`,另一个类型为 `fn(i32)->i32`
fn process(n: i32, func: fn(i32) -> i32) -> i32 {
  func(n)
}

функция как возвращаемое значение

Функция как возвращаемое значение объявляется так же, как объявление типа возвращаемого значения обычной функции.

Пример:

fn main() {
    let a = [1,2,3,4,5,6,7];
    let mut b = Vec::<i32>::new();
    for i in &a {
        b.push(get_func(*i)(*i));
    }
    println!("{:?}", b);
 }

 // 若传入的参数为偶数,返回 `inc`,否则返回 `dec`
 fn get_func(n: i32) -> fn(i32) -> i32 {
    fn inc(n: i32) -> i32 {
        n + 1
    }
    fn dec(n: i32) -> i32 {
        n - 1
    }
    if n % 2 == 0 {
        inc
    } else {
        dec
    }
}

Релевантная информация

Rust Programming Language

The Rust Reference

Rust By Example

RustPrimer