函式結構

函式要點
- 函式名和變數名使用蛇形命名法(snake case),例如
fn add_two() -> {} - 函式的位置可以隨便放,Rust 不關心我們在哪里定義了函式,只要有定義即可
- 每個函式引數都需要標注型別
函式引數
Rust 是強型別語言,因此需要你為每一個函式引數都標識出它的具體型別,例如:
fn main() {
another_function(5, 6.1);
}
fn another_function(x: i32, y: f32) {
println!("The value of x is: {}", x);
println!("The value of y is: {}", y);
}
another_function 函式有兩個引數,其中 x 是 i32 型別,y 是 f32 型別,然后在該函式內部,列印出這兩個值,這里去掉 x 或者 y 的任何一個的型別,都會報錯:
引數-值傳遞
值傳遞 是把傳遞的變數的值傳遞給函式的 形參,所以,函式體外的變數值和函式引數是各自保存了相同的值,互不影響,因此函式內部修改函式引數的值并不會影響外部變數的值,
fn double_price(mut price:i32){
price=price*2;
println!("內部的price是{}",price)
}
fn main() {
let mut price=99;
double_price(price); //輸出 內部的price是198
println!("外部的price是{}",price); //輸出 外部的price是99
}
引數-參考傳遞
值傳遞變數導致重新創建一個變數,但參考傳遞則不會,參考傳遞把當前變數的記憶體位置傳遞給函式,傳遞的變數和函式引數都共同指向了同一個記憶體位置,參考傳遞在引數型別的前面加上 & 符號,
fn double_price2(price:&mut i32){
*price=*price*2;
println!("內部的price是{}",price)
}
fn main() {
let mut price=88;
double_price2(&mut price); //輸出 內部的price是176
println!("外部的price是{}",price);//輸出 外部的price是176
}
星號(*) 用于訪問變數 price 指向的記憶體位置上存盤的變數的值,這種操作也稱為 解參考, 因此 星號(*) 也稱為 解參考運算子,
復合型別傳參
對于復合型別,比如字串,如果按照普通的方法傳遞給函式后,那么該變數將不可再訪問,
fn show_name(name:String){
println!("充電科目 :{}",name);
}
fn main() {
let name:String = String::from("從0到Go語言微服務架構師");
show_name(name);
println!("呼叫show_name函式后: {}",name);
}
報錯如下
error[E0382]: borrow of moved value: `name`
let name:String = String::from("從0到Go語言微服務架構師");
|---- move occurs because `name` has type `String`, which does not implement the `Copy` trait
|show_name(name);
| ---- value moved here
|println!("呼叫show_name函式后: {}",name);
| ^^^^ value borrowed here after move
函式回傳
函式在代碼執行完成后,除了將控制權還給呼叫者之外,還可以攜帶值給它的呼叫者,函式可以回傳值給它的呼叫者,稱為 函式回傳值,
Rust 語言的回傳值定義語法,在 小括號后面使用 箭頭 ( -> ) 加上資料型別 來定義的,函式的回傳值就是函式體最后一條運算式的回傳值,當然我們也可以使用 return提前回傳
- 有
return,回傳retrun值 - 無
return,回傳最末尾行的運算式值 - 兩種情況可以同時存在,如下代碼所示
fn plus_or_minus(x:i32) -> i32 {
if x > 5 {
return x - 5
}
x + 5
}
fn main() {
let x = plus_or_minus(5);
println!("The value of x is: {}", x);
}
plus_or_minus函式根據傳入x的大小來決定是做加法還是減法,若x > 5則通過return提前回傳x - 5的值,否則回傳x + 5的值,
無回傳值
- 函式沒有回傳值,那么回傳一個
() - 通過
;結尾的運算式回傳一個()
永不回傳的發散函式 !
發散函式(diverging function)絕不會回傳, 它們使用 ! 標記,這是一個空型別,
fn foo() -> ! {
panic!("This call never returns.");
}
和所有其他型別相反,這個型別無法實體化,因為此型別可能具有的所有可能值的集合為空, 注意,它與 () 型別不同,后者只有一個可能的值,這種型別的主要優點是它可以被轉換為任何其他型別,從而可以在需要精確型別的地方使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/509291.html
標籤:其他
