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
}
}