آموزش Rust-قسمت پنجم(توابع)


راست به صورت فراگیر از توابع پشتیبانی می‌کنه و ورودی تمامی کد هامون هم حتی داخل تابع main هست.برای تعریف یه تابع در راست از کلید واژه fn استفاده میشه قرارداد نام گذاری توابع در راست مثل قرارداد نام گذاری متغیرها snake_case هست.در ضمن هیچ فرقی نمی کنه که تابع تعریفی ما بالای تابع main باشه یا پایین. مثال:

fn main() {     
   println!(&quotHello, world!&quot);      
   another_function(); 
} 
fn another_function() {     
    println!(&quotAnother function.&quot);
}

خروجی :

Hello, world! 
Another function.

پارامترها

در راست نوع پارامترهای هر تابع رو باید مشخص کنید.پارامترها متغیرهایی در توابع هستند که فقط در حیطه اون تابع قابل شناسایی هستند ولی آرگومان ها مقادیریند که در زمان صدا زدن توابع به اون داده میشه مثال:

fn main() {
     another_function(5); 
}  
fn another_function(x: i32) {
     println!(&quotThe value of x is: {}&quot, x); 
}

مثال چند پارامتری:

fn main() {
     another_function(5, 6); 
 }  
fn another_function(x: i32, y: i32) {
     println!(&quotThe value of x is: {}&quot, x);     
     println!(&quotThe value of y is: {}&quot, 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!(&quotThe value of y is: {}&quot, y);
}

توی مثال بالا با استفاده از {} اول به کامپایلر گفتیم می‌خوایم یه مقداری رو بااستفاده از دستورالعمل های مختلف بنویسیم بعد به x مقدار 3 رو اختصاص دادیم تا اینجا ما فقط از عبارات دستوری استفاده کردیم ولی وقتی توی خط بعدی نوشتیم x+1 یعنی 4 رو برگردون. وقتی مقداری رو مثل بالا مینویسید اون رو به صورت خودکار برمی‌گردونه نکته دیگه اینه که در آخر مقداری که قرار هست برگرده نباید ; قرار بدین.

توابع با مقدار بازگشتی

برای برگشت مقدار در توابع Rust به صورت خودکار آخرین مقداری که تابع بدون ; هست رو برمی‌گردونه.البته شما می‌تونید خیلی زودتر با کلید‌واژه ی return خارج شید. مثال

fn five() -> i32 {
     5
}  
fn main() {
     let x = five(); 
     println!(&quotThe value of x is: {}&quot, x); 
}

اما اگر مثال پایین رو نگاه کنید:

fn main() {
     let x = plus_one(5); 
     println!(&quotThe value of x is: {}&quot, x); 
}
fn plus_one(x: i32) -> i32 {
     x + 1;
}

خطای زیر به خاطر این که هیچ مقداری رو برنگردوندیم و از ; در آخر x+1 استفاده کردیم:

خب این قسمت هم تموم شد و توی قسمت بعدی درباره ی عبارات شرطی صحبت می‌کنیم.

https://virgool.io/@komeilshahmoradi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-rust-%D9%82%D8%B3%D9%85%D8%AA-%D8%B4%D8%B4%D9%85%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%A7%D8%AA-%D8%B4%D8%B1%D8%B7%DB%8C-%D9%88-%D8%AD%D9%84%D9%82%D9%87%D9%87%D8%A7-wgkqsyimpubh


https://virgool.io/@komeilshahmoradi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-rust-%D9%82%D8%B3%D9%85%D8%AA-%DA%86%D9%87%D8%A7%D8%B1%D9%85%D9%86%D9%88%D8%B9-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7-bxx5wevvshp4