توابع یکی از اجزای اساسی برنامه نویسی Rust هستند. آنها به شما این امکان را میدهند که یک بلوک کد را کپسوله کنید که میتواند بارها و بارها با ورودیهای مختلفی فراخوانی شود. در اینجا یک مثال از یک تابع در Rust آمدهاست:
fn main() {
println!("The sum of 2 and 3 is {}", sum(2, 3));
}
fn sum(a: i32, b: i32) -> i32 {
a + b
}
در این مثال، تابعی را به نام sum تعریف میکنیم که دو آرگومان i32 را میگیرد و مجموع آنها را برمی گرداند. سپس تابع sum را با آرگومانهای 2 و 3 فراخوانی میکنیم و نتیجه را با استفاده از println در کنسول چاپ میکنیم.
Function Declaration
توابع در Rust با استفاده از کلمهی کلیدی fn و به دنبال آن نام تابع، پارامترها و نوع بازگشت (در صورت وجود) اعلام میشوند. در اینجا دستور کلی برای اعلان یک تابع در Rust آمدهاست:
fn function_name(parameter1: type1, parameter2: type2) -> return_type {
// بدنه تابع
// استفاده از مقادیر یارگشتی در صورت لزوم
}
در مثال بالا، تابع sum دو پارامتر، هر دو از نوع i32 را میگیرد و مقدار i32 را برمی گرداند.
Function Parameters
توابع در Rust میتوانند صفر یا چند پارامتر را داشته باشند. پارامترها در امضای تابع، داخل پرانتز قرار گرفته و با کاما از هم جدا میشوند. در اینجا یک مثال، از یک تابع، با دو پارامتر آورده شدهاست:
fn greet(name: &str, age: i32) {
println!("Hello, {}! You are {} years old.", name, age);
}
در این مثال، تابع greet دو پارامتر دارد: a &str (اشاره به یک رشته) و i32 (یک عدد صحیح). در داخل بدنه تابع، از مقادیر پارامترها برای چاپ پیام تبریک استفاده میکنیم.
Function Return Values
توابع در Rust میتوانند با استفاده از کلمهی کلیدی return و سپس مقدار بازگشتی، مقداری را برگردانند. یک مثال:
fn square(x: i32) -> i32 {
return x * x;
}
در این مثال، تابع square، آرگومان i32 را میگیرد و square آن آرگومان را برمیگرداند. برای برگرداندن نتیجه، از کلمه کلیدی بازگشت استفاده میکنیم.
با این حال، Rust یک سینتکس مختصر را نیز برای برگرداندن مقادیر، از توابع دارد که در آن میتوانید کلمهی کلیدی return را حذف کنید و به سادگی مقداری را که باید در انتهای بدنهی تابع برگردانده شود، مشخص کنید. در اینجا همان مثال، با استفاده از سینتکس کوتاه آمدهاست:
fn square(x: i32) -> i32 {
x * x
}
در این مثال، کلمهی کلیدی return را حذف کردهایم و بهسادگی مقداری را که باید به عنوان آخرین خط بدنه تابع برگردانده شود، مشخص کردهایم.
Functions with Multiple Return Values
Rust همچنین از توابعی با مقادیر بازگشتی چندگانه پشتیبانی میکند که به آنها 'tuples' نیز میگویند. یک مثال:
fn swap(a: i32, b: i32) -> (i32, i32) {
(b, a)
}
این تابع دو پارامتر i32 را میگیرد و یک tuple از همان نوع را برمیگرداند. tuple، شامل دو مقدار ورودی مبادله شدهاست.
برای استفاده از مقادیر بازگشتی یک تابع tuple، میتوانید tuple را destructure کنید یا از عملگر '.' برای دسترسی به عناصر آن استفاده کنید. در این مثال هر دو روش وجود دارند:
let (b, a) = swap(1, 2);
println!("a is {} and b is {}", a, b);
let tuple = swap(1, 2);
println!("a is {} and b is {}", tuple.1, tuple.0);
روش اول تاپل را مستقیماً به متغیرهای a و b تجزیه میکند؛ در حالیکه روش دوم با استفاده از عملگر نقطه، به دادهها دسترسی پیدا میکند.