راست به صورت فراگیر از توابع پشتیبانی میکنه و ورودی تمامی کد هامون هم حتی داخل تابع main هست.برای تعریف یه تابع در راست از کلید واژه fn استفاده میشه قرارداد نام گذاری توابع در راست مثل قرارداد نام گذاری متغیرها snake_case هست.در ضمن هیچ فرقی نمی کنه که تابع تعریفی ما بالای تابع main باشه یا پایین. مثال:
fn main() { println!("Hello, world!"); another_function(); } fn another_function() { println!("Another function."); }
خروجی :
Hello, world! Another function.
در راست نوع پارامترهای هر تابع رو باید مشخص کنید.پارامترها متغیرهایی در توابع هستند که فقط در حیطه اون تابع قابل شناسایی هستند ولی آرگومان ها مقادیریند که در زمان صدا زدن توابع به اون داده میشه مثال:
fn main() { another_function(5); } fn another_function(x: i32) { println!("The value of x is: {}", x); }
مثال چند پارامتری:
fn main() { another_function(5, 6); } fn another_function(x: i32, y: i32) { println!("The value of x is: {}", x); println!("The value of y is: {}", y); }
توابع دستوری توابعی هستند که تشکیل شده از تعدادی دستورالعمل اند و هیچ مقداری رو برنمیگردونن.اما توابع عبارتی هدفشون برگردوندن مقدار هست مثال:
fn main() { let y = 6; }
تابع بالا به کلی تابع دستوری هست و مقداری رو برنمیگردونه به بیان دیگه عدد 6 به متغیر y اختصاص پیداکرده.عبارات دستوری مقداری رو بر نمیگردونن مثال:
fn main() { let x = (let y = 6); }
عبارت بالا یه دلیل این که دستوری هست مقداری رو به x برنمیگردونه و به همین دلیل خطا میده:
$ cargo run Compiling functions v0.1.0 (file:///projects/functions) error: expected expression, found statement (`let`) --> src/main.rs:2:14 | 2 | let x = (let y = 6); ^^^ | = note: variable declaration using `let` is a statement
اما برای این که مثال بالا رو درست کنیم باید یه مقداری رو به x برگردونیم مثال:
fn main() { let x = 5; let y = { let x = 3; x + 1 }; println!("The value of y is: {}", y); }
توی مثال بالا با استفاده از {} اول به کامپایلر گفتیم میخوایم یه مقداری رو بااستفاده از دستورالعمل های مختلف بنویسیم بعد به x مقدار 3 رو اختصاص دادیم تا اینجا ما فقط از عبارات دستوری استفاده کردیم ولی وقتی توی خط بعدی نوشتیم x+1 یعنی 4 رو برگردون. وقتی مقداری رو مثل بالا مینویسید اون رو به صورت خودکار برمیگردونه نکته دیگه اینه که در آخر مقداری که قرار هست برگرده نباید ; قرار بدین.
برای برگشت مقدار در توابع Rust به صورت خودکار آخرین مقداری که تابع بدون ; هست رو برمیگردونه.البته شما میتونید خیلی زودتر با کلیدواژه ی return خارج شید. مثال
fn five() -> i32 { 5 } fn main() { let x = five(); println!("The value of x is: {}", x); }
اما اگر مثال پایین رو نگاه کنید:
fn main() { let x = plus_one(5); println!("The value of x is: {}", x); } fn plus_one(x: i32) -> i32 { x + 1; }
خطای زیر به خاطر این که هیچ مقداری رو برنگردوندیم و از ; در آخر x+1 استفاده کردیم:
خب این قسمت هم تموم شد و توی قسمت بعدی درباره ی عبارات شرطی صحبت میکنیم.