Rust ၏ အလိုအလျောက်မှတ်ဉာဏ်စီမံခန့်ခွဲမှုသည် developer အား pointer ခြယ်လှယ်ခြင်းမှ လွတ်မြောက်စေပြီး အခမဲ့ memory access များ၊ null pointer dereferences၊ buffer overruns ကဲ့သို့သော အဆင့်နိမ့်မှတ်ဉာဏ် ခြယ်လှယ်မှုမှ ဖြစ်ပေါ်လာသည့် ပြဿနာများကို ကာကွယ်ပေးပါသည်။ စာကြည့်တိုက်များကို ဖြန့်ဝေရန်၊ စုဝေးမှုကို သေချာစေရန်နှင့် ပရောဂျက်မှ မှီခိုမှုများကို စီမံခန့်ခွဲရန် ပက်ကေ့ဂျ်မန်နေဂျာကို တီထွင်နေပါသည်။
အဓိက
- ရည်ညွှန်းချက် "" ကို အသုံးပြု၍ တည်ဆောက်ပုံများ (struct) နှင့် စာရင်းကောက်ခြင်း (enum with Variant block) ကို အမှတ်အသားပြုနိုင်စွမ်းကို ပေါင်းထည့်ထားသည်။
#[မကုန်ခန်း ]" ဟူသောဒါဟာခွင့်ပြု နောင်တွင်၊ ကြေညာထားသော ဖွဲ့စည်းပုံများနှင့် စာရင်းကောက်မှုများတွင် အကွက်အသစ်များနှင့် ရွေးချယ်စရာများကို ပေါင်းထည့်ပါ။ ဥပမာအားဖြင့်၊ လူသိရှင်ကြားကြေငြာထားသော အကွက်များပါသည့် မော်ဂျူးများ၏ ဆော့ဖ်ဝဲအင်ဂျင်နီယာများသည် အနာဂတ်တွင် နယ်ပယ်အသစ်များ ထပ်ထည့်နိုင်သည့် ဖွဲ့စည်းပုံများကို အမှတ်အသားပြုရန် "#[non_exhaustive]" ကို အသုံးပြုနိုင်သည်။ ယခုအချိန်အထိ၊ ဤအခြေအနေတွင်၊ ဆော့ဖ်ဝဲရေးသားသူသည် နယ်ပယ်များကို သီးသန့်ကြေညာခြင်းနှင့် မပြောင်းလဲနိုင်သော အကွက်များစာရင်းတစ်ခုကြားတွင် ချိတ်ဆက်ရန် အတင်းအကြပ်ရွေးချယ်ခိုင်းခဲ့သည်။ ရည်ညွှန်းချက်အသစ်သည် ဤကန့်သတ်ချက်ကို ဖယ်ရှားပြီး ယခင်က စုစည်းထားသော ပြင်ပကုဒ်ကို ချိုးဖောက်ခြင်းအန္တရာယ်မရှိဘဲ အနာဂတ်တွင် အကွက်အသစ်များကို ထည့်သွင်းနိုင်စေမည်ဖြစ်သည်။ ကုန်သေတ္တာပက်ကေ့ဂျ်များတွင်၊ “ကိုက်ညီမှု” ကဏ္ဍရှိ ရွေးချယ်စရာများကို ကိုက်ညီသောအခါတွင် “_ => {...}” မျက်နှာဖုံး၏ ရှင်းလင်းပြတ်သားသော အဓိပ္ပါယ်ဖွင့်ဆိုချက် လိုအပ်ပြီး ဖြစ်နိုင်ခြေရှိသော အနာဂတ်နယ်ပယ်များကို ဖုံးအုပ်ထားရန် လိုအပ်သည်၊ သို့မဟုတ်ပါက အကွက်အသစ်များထည့်သည့်အခါ အမှားအယွင်းတစ်ခုပေါ်လာလိမ့်မည်။ -
ထပ်ပြောပါသည်။ အမျိုးအစား အကြောင်းအရာတစ်ခုတွင် procedural macro mac!() ကို ခေါ်နိုင်သည်။ ဥပမာအားဖြင့်၊ “expand_to_type” သည် လုပ်ထုံးလုပ်နည်း မက်ခရိုတစ်ခုဖြစ်လျှင် “type Foo = expand_to_type!(bar);” ဟု ရေးသားနိုင်ပါသည်။ - "extern { ... }" လုပ်ကွက်များတွင်
ထပ်ပြောသည်။ ဥပမာအားဖြင့် "bang!()" macro အပါအဝင် လုပ်ထုံးလုပ်နည်းနှင့် ရည်ညွှန်းချက် မက်ခရိုများကို သုံးနိုင်သည်-မက်ခရို_စည်းမျဉ်းများ။ make_item { ($name:ident) => { fn $name(); } }
ပြင်ပ {
make_item!(alpha);
make_item!(ဘီတာ);
}ပြင်ပ "C" {
#[my_identity_macro] fn foo();
} - မက်ခရိုတွင်
အကောင်အထည်ဖော်ခဲ့သည်။ “macro_rules!” ဒြပ်စင်များကို ဖန်တီးနိုင်စွမ်း။ "macro_rules!" ကိုထုတ်လုပ်နေသည် function-like macro (“mac!()”) နှင့် attributes ပုံစံ (“#[mac]”) တို့တွင် နှစ်မျိုးလုံး ဖြစ်နိုင်သည်။ - $m:meta mapping element တွင်
ထပ်ပြောသည်။ မထင်သလို တိုကင်စာရင်းကောက်ယူခြင်းတန်ဖိုးများ (“[TOKEN_STREAM]”၊ “{TOKEN_STREAM}” နှင့် “(TOKEN_STREAM)”)၊ ဥပမာ-မက်ခရို_စည်းမျဉ်းများ။ accept_meta { ($m:meta) => {} }
accept_meta!( my::path );
accept_meta!( my::path = "lit" );
accept_meta!( my::path ( abc ) );
accept_meta!( my::path [ abc ] );
accept_meta!( my::path { abc } ); - Rust 2015 မုဒ်တွင် NLL (Non-Lexical Lifetimes) နည်းပညာကို အသုံးပြု၍ ကိန်းရှင်များချေးငှားခြင်း (ချေးခြစ်သူ) ကို စစ်ဆေးသည့်အခါ ဖော်ထုတ်ထားသော ပြဿနာများအတွက် အမှားအယွင်းထွက်ပေါက်ကို ဖွင့်ထားသည်။ ယခင်က Rust 2018 မုဒ်တွင် လုပ်ဆောင်သည့်အခါ သတိပေးချက်များကို အမှားအယွင်းများဖြင့် အစားထိုးခဲ့သည်။
အပြောင်းအလဲကို Rust 2015 မုဒ်သို့ တိုးချဲ့ပြီးနောက်၊ developer များသည် နောက်ဆုံးတွင် လုပ်ဆောင်နိုင်ခဲ့သည်။ကိုရှင်းပစ်သည် ချေးငှားသူဟောင်းထံမှ ဝင်လာပါသည်။ချေးထားသော variable များ၏ သက်တမ်းကို ထည့်သွင်းသည့် ယန္တရားအသစ်ကို အခြေခံ၍ စိစစ်ရေးစနစ်သည် စိစစ်ရေးကုဒ်ဟောင်းကြောင့် သတိမပြုမိသော ပြဿနာအချို့ကို ဖော်ထုတ်နိုင်ခဲ့ကြောင်း သတိရကြပါစို့။ ထိုစစ်ဆေးမှုများအတွက် အမှားအယွင်းထွက်ရှိမှုသည် ယခင်လုပ်ဆောင်နေသည့်ကုဒ်နှင့် လိုက်ဖက်ညီမှုကို ထိခိုက်စေနိုင်သောကြောင့် သတိပေးချက်များကို အမှားများအစား အစပိုင်းတွင် ထုတ်ပြန်ခဲ့သည်။
- ကိန်းသေများအစား မည်သည့်အကြောင်းအရာတွင်မဆို အသုံးပြုရန် ဖြစ်နိုင်ခြေကို ဆုံးဖြတ်ပေးသည့် "const" ရည်ညွှန်းချက်ကို is_power_of_two လုပ်ဆောင်ချက် (လက်မှတ်မထိုးထားသော ကိန်းပြည့်များအတွက်) အတွက် အသုံးပြုသည်။
- API ၏ အပိုင်းအသစ်ကို todo!() macro နှင့် slice::repeat, mem::take, BTreeMap::get_key_value, HashMap::get_key_value အပါအဝင် တည်ငြိမ်သောအမျိုးအစားသို့ ရွှေ့လိုက်ပါပြီ၊ နည်းလမ်းများကို တည်ငြိမ်သွားပါပြီ။
ရွေးချယ်စရာ-:as_deref၊ ရွေးစရာ-:as_deref_mut၊ ရွေးစရာ-:flatten၊ UdpSocket::peer_addr၊ {f32,f64}::to_be_bytes, {f32,f64}::to_le_bytes,{f32,f64}::to_ne32,bytes၊ f64}::from_be_bytes၊ {f32,f64}::from_le_bytes၊ နှင့် {f32,f64}::from_ne_bytes။ - package manager မှာ cargo ပါ။
အကောင်အထည်ဖော်ခဲ့သည်။ ဒစ်ခ်ပေါ်ရှိ caching compiler သတိပေးချက်များ။ ရွေးချယ်စရာ "ကုန်တင် မက်တာဒေတာ" ကို "ကုန်တင်ကုန်ချ မက်တာဒေတာ" အမိန့်ကို ပေါင်းထည့်ခဲ့သည်။--filter-platform "မှီခိုမှုဖြေရှင်းချက်ကော်လံရှိ သတ်မှတ်ထားသော ပစ်မှတ်ပလပ်ဖောင်းသို့ ချည်နှောင်ထားသော ပက်ကေ့ဂျ်များကိုသာ ပြသရန်။ တရားဝင် TLS ဗားရှင်းများကို သတ်မှတ်ရန် http.ssl-ဗားရှင်းဖွဲ့စည်းမှုရွေးချယ်စရာကို ထည့်သွင်းထားသည်။
ထည့်သွင်းထုတ်ဝေနိုင်မှုအပိုင်း “၊dev-မှီခိုမှု ""ဗားရှင်း" သော့ကို မသတ်မှတ်ဘဲ။ - rustc compiler သည် ပစ်မှတ်ပလပ်ဖောင်း thumbv7neon-unknown-linux-musleabihf၊ aarch64-unknown-none-softfloat၊ mips64-unknown-linux-muslabi64 နှင့် mips64el-unknown-linux-muslabi64 အတွက် တတိယအဆင့် ပံ့ပိုးမှုပေးပါသည်။ တတိယအဆင့်တွင် အခြေခံပံ့ပိုးမှုပါဝင်သော်လည်း အလိုအလျောက်စမ်းသပ်ခြင်းနှင့် တရားဝင်တည်ဆောက်မှုများကို ထုတ်ပြန်ခြင်းမရှိဘဲ။
source: opennet.ru