<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های komeil shahmoradi</title>
        <link>https://virgool.io/feed/@komeilshahmoradi</link>
        <description>Backend Developer | .Net</description>
        <language>fa</language>
        <pubDate>2026-06-17 05:38:30</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/49403/avatar/jnkeGR.jpg?height=120&amp;width=120</url>
            <title>komeil shahmoradi</title>
            <link>https://virgool.io/@komeilshahmoradi</link>
        </image>

                    <item>
                <title>آموزش Rust-قسمت ششم(دستورات شرطی و حلقه‌ها)</title>
                <link>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</link>
                <description>اگر قبلا با دستورات شرطی توی هر زبانی آشنایی داشته باشید حتما این قسمت براتون خیلی آسون میشه کافیه به مثال زیر نگاهی بندازید که داره مقدار متغیر number رو بررسی می‌کنه،اگر مقدار کوچکتر از 7 باشه ()print اولی اجرا میشه در غیر این صورت ()print دومی.fn main() {
     let number = 3;
     if number &lt; 5 {
              println!(&amp;quotcondition was true&amp;quot);
     } else 
     {         
              println!(&amp;quotcondition was false&amp;quot);
     } 
}توجه کنید که عبارت if در صورتی شرطی رو چک میکنه که مقدار بازگشتیش true یا false باشه:fn main() {
     let number = 3;
     if number {
              println!(&amp;quotnumber was three&amp;quot);
     }
 }برنامه بالا خطای زیررو تولید می‌کنه:چند شرطیمیشه با ترکیب if و else عبارت else if رو به وجود آورد:fn main() {
     let number = 6;
     if number % 4 == 0 {
              println!(&amp;quotnumber is divisible by 4&amp;quot);
     } else if number % 3 == 0 {
              println!(&amp;quotnumber is divisible by 3&amp;quot);
     } else if number % 2 == 0 {
              println!(&amp;quotnumber is divisible by 2&amp;quot);
    } else {
             println!(&amp;quotnumber is not divisible by 4, 3, or 2&amp;quot);
   }
}خروجی برنامه بالا:number is divisible by 3استفاده از if و کلید واژه‌ی letبه دلیل این که if می‌تونه مقدار برگردونه می‌تونیم مثل مثال زیر ازش استفاده کنیم:fn main() {
     let condition = true;
     let number = if condition {
          5 
     }
     else { 
          6    
    }; 
    println!(&amp;quotThe value of number is: {}&amp;quot, number); }خروجی برنامه بالا :The value of number is: 5توجه کنید هر قسمت از بلاک های if باید نوع یکسانی رو برگردونن مثال:fn main() {
     let condition = true;
     let number = if condition {
              5    
    } else {
              &amp;quotsix&amp;quot
    };
    println!(&amp;quotThe value of number is: {}&amp;quot, number); }برنامه بالا به این دلیل که نوع های یکسانی رو برنمی‌گردونه توسط کامپایلر خطا میده:به همین دلیل می‌گیم راست در زبان کامپایل نیاز داره تا نوع همه متغیرها رو بدونه.loop,while,forحلقه‌ای که با کلید واژه‌ی loop ساخته میشه تا ابد، کد رو تکرار می‌کنه.تنها راه خارج شدن این که به صورت مستقیم خارج بشیم که جلوتر توضیح میدیم.fn main() {
     loop {
              println!(&amp;quotagain!&amp;quot);    
     }
}نتیجه:again!
again!
again!
again!
^Cagain!برای خروج از این حلقه بینهایت توی cmd باید ctrl+c بزنید.بازگشت مقدار از حلقهمیشه با کلیدواژه‌ی break از داخل حلقه خارج شد و حتی مقداری رو برگردوند.fn main() {
     let mut counter = 0;
     let result = loop {
              counter += 1;
              if counter == 10 {
                       break counter * 2; 
              }
    };
    println!(&amp;quotThe result is {}&amp;quot, result); 
}مثال بالا یه متغیر شمارنده ساختیم و تغییر پذیرش(mut) کردیم. حالا توی یه حلقه به مقدارش اضافه کردیم و چک می کنیم که اگر برابر 10 شد ضربدر 2 کنه و مقدارش رو برگدونه در واقع با دستور break هم از حلقه خارج شدیم و هم مقداری رو برگردوندیم. که نتیجه برابر 20 میشه.whileمیشه با استفاده از این دستور هم عمل چک کردن و هم عمل تکرار رو انجام داد:fn main() {
     let mut number = 3;
     while number != 0 {
          println!(&amp;quot{}!&amp;quot, number);
          number -= 1;
     }
     println!(&amp;quotLIFTOFF!!!&amp;quot); }حتی میشه ازش برای خواندن عناصر آرایه‌ها هم استفاده کرد:fn main() {
     let a = [10, 20, 30, 40, 50];
     let mut index = 0;
     while index &lt; 5 {
              println!(&amp;quotthe value is: {}&amp;quot, a[index]);
              index += 1;
     }
}که نتیجه میشه:the value is: 10
the value is: 20
the value is: 30
the value is: 40
the value is: 50forمیشه از for هم برای حلقه‌ها استفاده کرد. که خیلی شبیه به foreach توی زبون های دیگست.مثال زیر یه حلقست که عناصر یه آرایه رو میخونه:fn main() {
     let a = [10, 20, 30, 40, 50];
           for element in a.iter() {
                    println!(&amp;quotthe value is: {}&amp;quot, element);
           }
}آرایه ها به صورت پیش فرض قابل شمارش نیستند به این معنی که باید اون ها رو با متد ()iter. برای for قابل شمارش کرد درباره‌ی این موضوع بعد بیشتر صحبت می‌‌کنیم.کد بالا عناصر آرایه a رو یکی یکی واکشی میکنه و در آرایه‌ی element میزاره و داخل حلقه توسط print چاپ میکنه.مثال دیگه ای از for برای چاپ کردن اعداد به صورت برعکس:fn main() {
     for number in (1..4).rev() {
              println!(&amp;quot{}!&amp;quot, number);
     }
     println!(&amp;quotLIFTOFF!!!&amp;quot); }یه بازه از اعداد با .. از 1 تا 4 ساختیم و داخل پرانتز قرار دادیم و بهش یه متد توکاری به نام ()rev. رو بهش دادیم یعنی به جای این که از 1 تا 4 بره،به صورت برعکس از 4 تا 1 اعداد رو چاپ میکنه.این بخش هم تموم شد.من توی 4 قسمت مهمترین و اساسی ترین مفاهیم Rust رو گفتم.امیدوارم حالا با این مفاهیم چند تا تمرین کوچیک بنویسید و خوب تمرین کنید برای شروع می‌تونید از تمرینات زیر استفاده کنید:تبدیل فارنهایت به سیلیسیوس و برعکسچاپ اعداد فیبوناچیچاپ اعداد زوج و فرداگر خواستید می‌تونید جواب ها رو توی بخش نظرات برام بفرستید. https://virgool.io/@komeilshahmoradi/yfbfbeugvbwt </description>
                <category>komeil shahmoradi</category>
                <author>komeil shahmoradi</author>
                <pubDate>Thu, 31 Oct 2019 14:14:38 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش Rust-قسمت پنجم(توابع)</title>
                <link>https://virgool.io/@komeilshahmoradi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-rust-%D9%82%D8%B3%D9%85%D8%AA-%D9%BE%D9%86%D8%AC%D9%85%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-yfbfbeugvbwt</link>
                <description>راست به صورت فراگیر از توابع پشتیبانی می‌کنه و ورودی تمامی کد هامون هم حتی داخل تابع main هست.برای تعریف یه تابع در  راست از کلید واژه fn استفاده میشه قرارداد نام گذاری توابع در راست مثل قرارداد نام گذاری متغیرها snake_case هست.در ضمن هیچ فرقی نمی کنه که تابع تعریفی ما بالای تابع main باشه یا پایین. مثال:fn main() {     
   println!(&amp;quotHello, world!&amp;quot);      
   another_function(); 
} 
fn another_function() {     
    println!(&amp;quotAnother function.&amp;quot);
}خروجی :Hello, world! 
Another function.پارامترهادر راست نوع پارامترهای هر تابع رو باید مشخص کنید.پارامترها متغیرهایی در توابع هستند که فقط در حیطه اون تابع قابل شناسایی هستند ولی آرگومان ها مقادیریند که در زمان صدا زدن توابع به اون داده میشه مثال:fn main() {
     another_function(5); 
}  
fn another_function(x: i32) {
     println!(&amp;quotThe value of x is: {}&amp;quot, x); 
}مثال چند پارامتری:fn main() {
     another_function(5, 6); 
 }  
fn another_function(x: i32, y: i32) {
     println!(&amp;quotThe value of x is: {}&amp;quot, x);     
     println!(&amp;quotThe value of y is: {}&amp;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`)
  --&gt; 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!(&amp;quotThe value of y is: {}&amp;quot, y);
}توی مثال بالا با استفاده از {} اول به کامپایلر گفتیم می‌خوایم یه مقداری رو بااستفاده از دستورالعمل های مختلف بنویسیم بعد به x مقدار 3 رو اختصاص دادیم تا اینجا ما فقط از عبارات دستوری استفاده کردیم ولی وقتی توی خط بعدی نوشتیم x+1 یعنی 4 رو برگردون. وقتی مقداری رو مثل بالا مینویسید اون رو به صورت خودکار برمی‌گردونه نکته دیگه اینه که در آخر مقداری که قرار هست برگرده نباید ; قرار بدین.توابع با مقدار بازگشتیبرای برگشت مقدار در توابع Rust به صورت خودکار آخرین مقداری که تابع بدون ; هست رو برمی‌گردونه.البته شما می‌تونید خیلی زودتر با کلید‌واژه ی return خارج شید. مثالfn five() -&gt; i32 {
     5
}  
fn main() {
     let x = five(); 
     println!(&amp;quotThe value of x is: {}&amp;quot, x); 
}اما اگر مثال پایین رو نگاه کنید:fn main() {
     let x = plus_one(5); 
     println!(&amp;quotThe value of x is: {}&amp;quot, x); 
}
fn plus_one(x: i32) -&gt; 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 </description>
                <category>komeil shahmoradi</category>
                <author>komeil shahmoradi</author>
                <pubDate>Tue, 29 Oct 2019 17:15:22 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش Rust-قسمت چهارم(نوع داده ها)</title>
                <link>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</link>
                <description>راست یک زبان نوع ایستاست(Statically type language).مفهومش اینه که کامپایلر در زمان اجرای برنامه باید از نوع تمامی متغیرهای استفاده شده در برنامه خبر داشته باشه.بعضی موارد پیش میاد که خود کامپایلر می تونه حدس بزنه که چه نوعی رو برای متغیربر اساس مقداری که بهش دادیم، انتخاب کنه و بعضی مواقع نمی تونه یه مثال:let guess: u32 = &amp;quot42&amp;quot.parse().expect(&amp;quotNot a number!&amp;quot);مثال بالا یک رشته عددی رو با کمک متد ()parse به عدد تبدیل می‌کنه و اون رو در متغیر از نوع اعداد غیرعلامت دار میریزه (جلوتر بیشتر توضیح میدیم).متد ()expect برای جلوگیری از خطاست به این معنا که اگر کاربری به جای عدد مثلا رشته &quot;42w&quot; رو وارد کرد و ()parse نتونست این رشته رو به عدد تبدیل کنه متد ()expect رشته ی &quot;Not a number&quot; رو به عنوان پیغام خطا چاپ می‌کنه.اگر در مثال بالا نوع داده رو مشخص نکینم با خطای زیر رو به رو می‌شیم:error[E0282]: type annotations needed  
--&gt; src/main.rs:2:9   
    | 
2  |     let guess = &amp;quot42&amp;quot.parse().expect(&amp;quotNot a number!&amp;quot);   
    |          ^^^^^   
    |        
    |   |         cannot infer type for `_`   
    |         consider giving `guess` a typeنوع‌های مقیاسینوع مقیاسی نمایش دهنده ی یه مقدار هست.راست از چهار نوع مقیاس متفاوت پشتیبانی می‌کنه.اعداد صحیح(Integer)،اعداد اعشار(floating-point numbers)،بولی(Boolean)،کارکتر(char).اعداد صحیحبازه‌ی اعداد صحیح علامت‌دار از فرمول زیر استفاده میشه:بازه‌اعداد غیرعلامت دار هم :جدول زیر انواع داده صحیح علامت دار و غیر علامت دار رو همراه با مقدار حافظه‌ای که در بر می‌گیرند نمایش میده.به عنوان مثال اگر بخوایم بازه‌ی اعدادی که در نوع i8 در نظر بگیریم از فرمول بالا استفاده می‌کنیم که میشه 127 تا 128- میشه.نوع مقادیری که میشه به انواع جدول بالا داد در جدول زیر هست:حالا از کجا تشخیص بدیم که برای برنامه مون چه نوعی رو انتخاب کنیم؟به صورت پیش فرض i32 توسط کامپایلر انتخاب میشه که بهترین انتخاب هست حتی توی سیستم های 64بیتی.سرریز اعداد صحیح(Integer Overflow) فرض کنید از u8 برای برنامه مون استفاده کنیم بازی u8 از 0 تا 255 هست خب اگر من برنامه نویس به اشتباه عدد 256 رو وارد کنم چی اتفاقی میفته؟اگر توی حالت Debug Mode باشه کامپایلر در هنگام اجرا اخطار میده (Panic).اگر در حالت Release Mode باشه Rust پیغام خطای نمایش نمیده و به جاش عدد 256 رو به مکمل دو تبدیل میکنه که میشه 0 و اگر 257 بزنیم مکمل دو میشه 1. اعداد اعشاریدو نوع f32 و f64 هست که به صورت پیش فرض اگر در عدد اعشار وارد شده نوع رو مشخص نکینم Rust f64 رو انتخاب می‌کنه که خود راست دلیل این کار رو به دلیل سرعت بالا در cpu های مدرن می‌دونه مثال:fn main() {     
    let x = 2.0; // f64 
    let y: f32 = 3.0; // f32
}عملگرهای عددیشامل جمع،تفریق،ضرب و تقسیم هست:fn main() {    
    // addition 
    let sum = 5 + 10;     
    // subtraction 
    let difference = 95.5 - 4.3;     
    // multiplication 
    let product = 4 * 30;      
    // division 
    let quotient = 56.7 / 32.2;      
    // remainder 
    let remainder = 43 % 5; 
 }نوع بولیمثل زبان های برنامه نویسی دیگه دارای دو مقدار false و true داره.fn main() {     
    let t = true;      
    let f: bool = false; // with explicit type annotation
}نوع کاراکتریحروف در Rust با استفاده از &#x27; Single Qution جدا میشن.fn main() {     
    let c = &#039;z&#039;;     
    let z = &#039;ℤ&#039;;     
    let heart_eyed_cat = &#039;?&#039;;
}انواع مرکب تاپلتاپل ها یکی از راه های گروه بندی کردن انواع مختلف هست.تاپل ها دارای طول یکسان هستند به این معنا که زمانی که یک تاپل رو ساختید دیگه نمی‌تونید طولش رو افزایش یا کاهش بدین.برای ساخت تاپل باید از اعداد رو با کاما در داخل پرانتز از هم جدا کنید و هر عدد می‌تونه نوع متفاوتی داشته باشهfn main() {     
    let tup: (i32, f64, u8) = (500, 6.4, 1); 
}برای خواندن مقادیر از تاپل از دو روش میشه استفاده کرد که با مثال نمایش دادم:fn main() {     
    let tup = (500, 6.4, 1);      
    let (x, y, z) = tup;      
    println!(&amp;quotThe value of y is: {}&amp;quot, y); 
}در مثال بالا یه تاپل بدون در نظر گرفتن نوع‌ها ایجاد کردیم و حالا هر مقدار رو به در خط دوم به یک متغیر نسبت دادیم و وقتی y رو چاپ کنیم مقدار 6.4 چاپ میشه.روش دوم: فراخوانی مستقیم مقدارها با استفاده از .let x: (i32, f64, u8) = (500, 6.4, 1);      
let five_hundred = x.0;      
let six_point_four = x.1;      
let one = x.2;اگر با زبان‌های برنامه نویسی دیگه آشنا باشید معمولا اون ها هم مثل Rust اندیس‌هاشون از 0 شروع میشه.نوع مرکب آرایهراه دیگه برای گروه‌بندی کردن مقادیر استفاده از آرایه هاست،فرقش با تاپل اینه که مثل تاپل نمی‌تونید انواع مختلفی رو در یه آرایه کنار هم قرار بدین به معنای دیگه اگر در یک آرایه عدد عنصر اول عدد بود باید تا آخرین عنصر عدد باشه یا اگر یک عنصر رشته بود باید عناصر دیگه هم رشته باشه و به جای پرانتز از براکت استفاده می کنه.fn main() {     
    let a = [1, 2, 3, 4, 5];
}به گفته خود سایت Rust، آرایه ها زمانی خیلی مفید هستند که می‌خوایم تقسیم حافظه در Stack به جای Heap باشه که در این مورد توی آموزش های بعدی صحبت می‌کنیم.یه مثال دیگه برای رشته‌ها.let months = [&amp;quotJanuary&amp;quot, &amp;quotFebruary&amp;quot, &amp;quotMarch&amp;quot, &amp;quotApril&amp;quot, &amp;quotMay&amp;quot, &amp;quotJune&amp;quot, &amp;quotJuly&amp;quot,&amp;quotAugust&amp;quot, &amp;quotSeptember&amp;quot, &amp;quotOctober&amp;quot, &amp;quotNovember&amp;quot, &amp;quotDecember&amp;quot];برای آرایه ها می‌تونیم تعداد و نوع مشخص کنیم.let a: [i32; 5] = [1, 2, 3, 4, 5];اگر می خواید یه آرایه درست کنید که دارای پنج آرایه باشه و هر پنج آرایه دارای مقدار 3 باشنlet a = [3, 3, 3, 3, 3];راه دومlet a = [3; 5];خواندن اعداد از آرایه‌هاfn main() {     
    let a = [1, 2, 3, 4, 5];      
    let first = a[0];     
    let second = a[1]; 
}اگر اندیس آرایه‌ای رو اشتباه وارد کنید با خطا مواجه میشینfn main() {     
    let a = [1, 2, 3, 4, 5];     
    let index = 10;      
    let element = a[index];      
    println!(&amp;quotThe value of element is: {}&amp;quot, element); 
}آرایه ی مثال بالا دارای پنج عنصر هست اما ما عنصر 10 رو درخواست کردیم و برنامه در هنگام اجرا خطای زیر رو نمایش میده:$ cargo run    
    Compiling arrays v0.1.0 (file:///projects/arrays)     
    Finished dev [unoptimized + debuginfo] target(s) in 0.31 secs      
    Running `target/debug/arrays` thread &#039;main&#039; panicked at &#039;index out of bounds: the len is 5 but the index is  10&#039;, src/main.rs:5:19 note: Run with `RUST_BACKTRACE=1` for a backtrace.خب این آموزش هم تموم شد توی آموزش بعدی درباره‌ی فانکشن ها صحبت می‌کنیم. https://virgool.io/@komeilshahmoradi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-rust-%D9%82%D8%B3%D9%85%D8%AA-%D9%BE%D9%86%D8%AC%D9%85%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-yfbfbeugvbwt </description>
                <category>komeil shahmoradi</category>
                <author>komeil shahmoradi</author>
                <pubDate>Fri, 25 Oct 2019 13:15:26 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش Rust- قسمت سوم(متغیرها و تغییر پذیری )</title>
                <link>https://virgool.io/@komeilshahmoradi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-rust-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7-%D9%88-%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D9%BE%D8%B0%DB%8C%D8%B1%DB%8C-smdzyra3acat</link>
                <description>متغیرها و تغییر پذیریتوجه تمامی آموزش‌های قرار گرفته شده در این مجموعه آموزشی، ترجمه مبتدی help خود زبان Rust می‌‌باشد.منبع اصلیمتغیرها و تغییرپذیریبرای تعریف متغیرها در Rust از کلمه‌ی رزرو شده let باید استفاده کنیم و در آخر هر خط ; باید بزاریم:let _x = 5;قرارداد نام گذاری متغیرهای محلی در Rust به صورت snake_case هست یعنی تمام نام،با حروف کوچیک نوشته میشه و برای خوانایی بهتر از زیرخط(Underline) استفاده میشه:let snake_case = 0;در Rust متغیرها به صورت پیش فرض تغییرناپذیرند(Immutable).خیلی ها این مفهوم رو با ثابت ها(constant)اشتباه می‌گیرن که جلوتر دربارش صحبت می‌کنیم.زمانی که تغییرناپذیری رو با مقداری تعریف می‌‌کنیم اگر دوباره مقداری بهش بدیم کامپایلر خطا میده.اجازه بدین تا با مثال های زیر شروع کنیم:fn main() {     
    let x = 5;     
    println!(&amp;quotThe value of x is: {}&amp;quot, x);     
    x = 6;     
    println!(&amp;quotThe value of x is: {}&amp;quot, x); 
} اگر برنامه بالا رو در Vscode با هر روش اجرا کنیم خطای زیر رو به ما نشون میده:error[E0384]: cannot assign twice to immutable variable `x` 
 --&gt; src/main.rs:4:5   
 | 2 |     let x = 5;   
 |         - first assignment to `x` 3 
 |     println!(&amp;quotThe value of x is: {}&amp;quot, x); 4 |     x = 6;   
 |     ^^^^^ cannot assign twice to immutable variableدر برنامه‌ی بالا با استفاده از ()!println نتیجه رو در کنسول چاپ کردیم اگر هم با برنامه نویسی c# کار کرده باشین میدونین که استفاده از {} در رشته‌ها باعث چاپ کارکتری مخصوصی در اون قسمت میشه مثال:println!(&amp;quotThe value of x is: {}&amp;quot, x); در بالا x به جای {} چاپ میشه.اما متغیرها فقط به صورت پیش فرض تغییر ناپذیرند و میشه اون ها رو با mut تغییر پذیر کرد:fn main() {     
    let mut x = 5;  
    println!(&amp;quotThe value of x is: {}&amp;quot, x);     
    x = 6;     println!(&amp;quotThe value of x is: {}&amp;quot, x); 
}و نتیجه به صورت زیر هست:The value of x is: 5 
The value of x is: 6تفاوت متغیرها(تغییرپذیرها) و ثابت هاتغییر مقدار یه متغیری که به صورت پیش فرض تغییرناپذیر هست (توی یه جمله چقدر غ گفتم) با یه ثابت کاملا متفاوته.برای تعریف ثابت‌ها از mut نمی‌شه استفاده کرد و همیشه ثابت هستند و در هیچ جای دیگه قابل تغییر نیستندبرای تعریف از کلیدواژه const به جای let استفاده میشهحتما باید نوعشون مشخص باشه که در آموزش بعدی با مفهوم نوع ها بیشتر آشنا میشمدر مثال زیر یه ثابت با نامMAX_POINTS تعریف شده که مقدارش برابر شده با 100000 که با استفاده از _ برای خوانایی بیشتر از هم جدا شده.قرارداد نام گذاری ثابت‌ها هم به صورت Uppercase با Underline.const MAX_POINTS: u32 = 100_000; پنهان کردن(Shadowing)در Rust می‌تونیم یه متغیر هم اسم متغیر قبلی تعریف کنید، به شرطی که از کلید واژه let قبل از نام متغیر استفاده کنید. مثال:fn main() {     
    let x = 5;      
    let x = x + 1;      
    let x = x * 2;      
    println!(&amp;quotThe value of x is: {}&amp;quot, x); 
}توی خط اول متغیری با نام x با مقدار 5 معرفی کردیم و در خط بعدی بدون این که از کلید واژه mut استفاده کنیم مقدار اون رو تغییر دادیم و همین کار رو در خط سوم هم انجام دادیم.برنامه باید مقدار 5 رو چاپ کنه یا حداقل خطا بده ولی داره از مفهوم shadowing استفاده می‌کنه و مقدار 12 رو چاپ می‌کنه.پنهان کردن با mut کردن یه متغیر متفاته. برای درک بهتر به دو مثال پایین خوب توجه کنید:let spaces = &amp;quot   &amp;quot 
let spaces = spaces.len();با استفاده از کلید واژه let هم از مفهموم shadowing استفاده کردیم و هم نوع متغیر رو تغییر دادیم.(نوع متغیر در خط اول رشته است و در خط دوم عدد) مثال بالا خطایی ندارد و نتیجه رو اگر چاپ کنیم تعداد space هایی رو که در رشته بوده به صورت عدد بر می‌گردونه که در این مثال 3 هست. اما اگر از کلید واژه ی mut استفاده کنیم :let mut spaces = &amp;quot   &amp;quot 
spaces = spaces.len();خطا :error[E0308]: mismatched types  
--&gt; src/main.rs:3:14   
   | 
3 |     spaces = spaces.len();   
   |                     ^^^^^^^^^^^^ expected &amp;str, found usize   
   |   = note: expected type `&amp;str`              
                   found type `usize`خب این قسمت هم تموم شد سعی کنید خوب این مفاهیم رو درک کنید چرا که هرچی جلوتر بریم مفاهیم یه مقدار سخت‌تر میشه.توی آموزش بعدی درباره‌ی نوع داده ها صحبت می‌کنیم. 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  https://virgool.io/@komeilshahmoradi/آموزش-rust-قسمت-دومنصب-و-راه-اندازی-qsdpsfe5iqfj </description>
                <category>komeil shahmoradi</category>
                <author>komeil shahmoradi</author>
                <pubDate>Mon, 21 Oct 2019 13:49:18 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش Rust- قسمت دوم(نصب و راه اندازی)</title>
                <link>https://virgool.io/coderlife/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-rust-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85%D9%86%D8%B5%D8%A8-%D9%88-%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-qsdpsfe5iqfj</link>
                <description>نصب و را‌ه‌اندازی پیش نیازدر حال حاضر برای نسخه جدید Rust باید Microsoft C++ Build Tools رو سایت مایکروسافت نصب کنید.توی این آموزش من از ادیتور Visual Studio Code استفاده کردم که در ادامه نحوه نصب کامل رو براتون توضیح دادم.نصب Rust در لینوکسبرای نصب در سیستم عامل هایی که زیرمجموعه لینوکس هست کافیه خط زیر رو در ترمینال تایپ کنیم:curl https://sh.rustup.rs -sSf | shنصب Rust در ویندوزاگر از ویندوز استفاده می‌کنید باید rustup رو نصب کنید.Rustup یه برنامه است که با خودش Cargo(مدیریت پکیج های Rust)،یه rustc(کامپایلر) و Toolchain پیش فرض نصب میکنه(مجموعه ای از برنامه ها و کد ها که کد شما را تبدیل به صفر و یک میکنه.یه سوال پس فرقش با کامپایلر چیه؟فرقش اینه که کامپایلرها می‌تونن جزئی از یه مجموعه بزرگتر به نام Toolchain باشن.درواقع یه Toolchain از کامپایلر + Linker + کتابخونه + و ابزارهای دیگه تشکیل شده ).دانلود Rustup با لینک مستقیمدانلود Rustup از سایت اصلیتوجه برای کامل کردن نصب حتما به اینترنت نیاز داریدوقتی بر روی rustup کلیک کنید صفحه cmd ویندوز باز میشه .اگر  Microsoft C++ Build Tools رو نصب نکرده باشین با پیغام خطای قرمز زیر روبه‌رو میشین.البته بعد از نصب هم می تونین اون رو نصب کنید ولی بهتره از قبل این کار رو انجام بدین.خطاسپس y رو تایپ و اینتر بزنید:انتخابسپس عدد یک رو انتخاب کنید و اینتر بزنید:دانلودحالا اتصالتون رو با اینترنت قطع نکنید تا کامل بشه و در آخر اینتر بزنید و خارج بشید. حالا در cmd تایپ کنید:&gt; rustupو باید صفحه زیر رو نمایش بدهنصب موفقیت آمیزنصب Extension برای VS CODEوقتی vs code رو نصب می‌کنید مثل بقیه ی ادیتورها نیاز به پلاگین های مخصوصی داره تا از Rust بشه استفاده کرد.اکستنشن (Rust(RLS : این اکستنشنی هست که توسط خود سایت Rust معرفی شده و حتما باید نصب بشه. می تونید به صورت دستی هم نصب کنید.(Rust(RLSاکستنشن Crates : برای مدیریت پکیج هایی هست که از سایت carets.io دانلود می‌کنید دربارش جلوتر توضیح میدم.Carets اکستنشن Better TOML : فایل های Toml بیشتر برای لیست کردن پکیج های مورد استفاده در Rust هست ولی میشه از اون برای برنامه نویسی هم استفاده کرد این اکستنشن برای اینه که قواعد دستوری رو برای این فایل ها به Vs code اضافه کنه.Better TOMLساخت اولین پروژهبرای این کار کافیه CMD رو باز کنید و در مسیری که می‌خواید از دستور زیر استفاده کنید:&gt; cargo new hello-worldاینتر بزنید وبرید و ساختار فایل هارو رو نگاه کنید.Rust از ساختار زیر استفاده میکنه:فایل gitignore. که برای git repository هست.فولدر src که شامل فایل main.rs هست و کدهامون توی اون مینویسیمفایل cargo.toml که بالاتر توضیح دادمخب نوبت به استفاده از vscode هست، بازش کنید و از منوی Open گزینه‌ی open folder رو بزنید و فولدری که فایل های مربوط به Rust در اون هست رو انتخاب کنید این جوری تمامی فایل های مورد نظر درون vscode نمایان میشه.و حالا دوباره از منوی Open گزینه‌ی save workspace as رو بزنید تا فضای کاری خودتون رو ذخیره کنید، یه اسم براش انتخاب کنید و در آخر بایدتصویر زیر رو داشته باشین:راه‌اندازی Vscode خب حالا برای این که برنامه رو اجرا کنید و نتیجه رو ببنید چند تا راه وجود داره یکی این که از طریق CMD این کار رو انجام بدین:&gt; cargo runوقتی اینتر بزنید با تصویر زیر روبه‌رو میشن:نتیجه hello word من از پوسته ی cmder برای cmd استفاده می‌کنم برای همین ظاهر متفاوته ولی نتیجه یکیه.راه بعدی برای اجرای برنامه استفاده از خوده Vscode هست.از منوی Terminal گزینه ی configure defualt build task رو بزنید و گزینه ی  Rust:cago run hello-word رو انتخاب کنید این جوری هر بار که ctrl+shift+B رو که بزنید دستور cargo run hello-word به صورت پیش فرض اجرا میشه و در پایین Vscode نتیجه نمایش داده میشه.اجرای Rust در Vscode راه اخر که بهترین راه هست نصب C/C++ for Visual Studio Codeاول ctrl+shift+x رو بزنید تا برید توی بخش Extension ها حالا در بخش سرچ تایپ کنید c++ debug و اون رو install کنید:c++ debug بعد از نصب از منوی Debug گزینه‌ی Add configuration رو بزیند و گزینه‌ی c++ windows رو انتخاب کنیدبا این کار یه فایل launch.json به پروژه اضافه میشه، بازش کنید و در قسمت program مسیر فایل .exe Rust رو بدین:program&amp;quot: &amp;quot${workspaceFolder}/target/debug/hello-world.exe&amp;quot, برای این که بتونید از Break point هم استفاده کنید، از منوی File گزینه‌ی preferences  و سپس Settings رو انتخاب کنید و  برید به بخش future و Debug  رو انتخاب کنید و گزینه ی Allow Breakpoint Everywhere رو فعال کنید:Allow Breakpoint Everywhereحالا برای اجرای برنامه ها در حالت دیباگ F5 و برای اجرا در حالت عادی ctrl+F5 بزنید.خب این بخش تموم شد. از قسمت بعد آموزش قواعد و ... شروع می‌کنیم. https://virgool.io/@komeilshahmoradi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-rust-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7-%D9%88-%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D9%BE%D8%B0%DB%8C%D8%B1%DB%8C-smdzyra3acat  https://virgool.io/@komeilshahmoradi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-rust-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-rust-%DA%86%DB%8C%D8%B3%D8%AA-cjpv3zsjb0wo </description>
                <category>komeil shahmoradi</category>
                <author>komeil shahmoradi</author>
                <pubDate>Sat, 19 Oct 2019 11:43:57 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش Rust-قسمت اول (Rust چیست؟)</title>
                <link>https://virgool.io/coderlife/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-rust-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-rust-%DA%86%DB%8C%D8%B3%D8%AA-cjpv3zsjb0wo</link>
                <description>زبان برنامه نویسی راست چیست؟تاریخچه کوتاهدر سال 2010 برای اولین بار توسط فردی(Graydon Hoare) از طرف بنیاد موزیلا به صورت منبع باز عرضه شد.ویژگی هایک زبان Multi-paradigm(چند پارادایمی)  :  به شیوه های برنامه نویسی که این زبان پشتیبانی میکنه میگن.مثلا اگر ++c کار کرده باشین می دونین که این زبان هم برنامه نویسی به صورت رویه ای(Procedural) رو قبول میکنه هم شیء گرا(Object Oriented).حالا زبان Rust تقریبا از همه ی این موارد پشتیبانی میکنه.(object-oriented,concurrent, functional, generic, imperative, structured) بیشتربیشترین تمرکز بر روی امنیت حافظه : عدم استفاده از اشاره گرهای Null،عدم استفاده از Dangling Pointer ها (اشاره گرهایی که به نوع قابل پذیرشی اشاره نمی کنند مثل اشاره به محل های ممنوعه در حافظه).عدم اجازه Data Race در حافظه(وضعیت رقابتی زمانی اتفاق میفته که پردازش های مختلف به یک منبع اشتراک گذاری شده در یه لحظه دسترسی پیدا می کنن).بیشترمدیریت حافظه : Rust مثل بقیه زبان های برنامه نویسی مثل GO،Java،.Net Languages از مفهوم automated garbage collection یا همون آشغال جمع کن به صورت کامل استفاده نمی کنه،البته میشه یه جورایی خودمون استفادش کنیم ولی به جاش از مفهومی به نام RAII که به زبون ساده وقتی یه متغیر یا یک شیء از محدوده یا Scope خودش خارج میشه به طور خودکار مخرب (Destruction) فراخونی میشه و تمامی منابع رو ازش میگیره.بیشترقواعد دستوری (Syntax) شبیه به ++Cسرعت بالا Benchmarkچرا Rust ؟برنامه ای که درستی اون با تست چک شده با برنامه ای که درستیش به صورت منطقی اثبات شده فرق زیادی داره.متاسفانه خیلی از موارد وجود داره که هر چقدر هم ما برنامه را خط به خط تست کنیم بازم پیش میاد مواردی که از حیطه دانش ما یا هر چیز دیگه ای خارج هست.اینجاست که استفاده از یک زبان حساس به این موارد شما را خیلی جلو میندازه.Rust برای هر متغیری که می نویسید و هر آدرس حافظه ای که استفاده می کنید بسیار سخت گیر و موشکافانه است.در Rust سخت ترین کار نوشتن یک برنامه خطرناکه و راحت ترین کار نوشتن یک برنامه ایمن.تا چه حد؟همین قدر کافی هست که به شرکت ها و اسم های زیر که از Rust در اون ها استفاده میشه نگاهی بندازید تا قدرت بالای اون درک کنید:MozillaDropboxRedox Operating SystemTockRailcarMicrosoft Azureدوست داشتنی ترین زبان از زبان Stack overflow https://coderlife.ir/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-rust-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85%D9%86%D8%B5%D8%A8-%D9%88-%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-qsdpsfe5iqfj </description>
                <category>komeil shahmoradi</category>
                <author>komeil shahmoradi</author>
                <pubDate>Thu, 17 Oct 2019 11:32:28 +0330</pubDate>
            </item>
            </channel>
</rss>