
Rust-ի համար անվանված ու ոչ պարտադիր արգումենտների առաջարկ
botahamec.dev բլոգի հեղինակը Rust-ի ամենաթույլ կողմը համարում է անվանված և ոչ պարտադիր արգումենտների բացակայությունը։ Գրառումը համեմատում է Dart-ը, C#-ը և TypeScript-ը և ներկայացնում սեփական pre-RFC-ն։
botahamec.dev-ում հրապարակված գրառման հեղինակը պնդում է, որ Rust-ի ամենանյարդացնող պակասը անվանված ու ոչ պարտադիր արգումենտների բացակայությունն է։ Նա նշում է, որ «հանդուրժած» լեզուներից անվանված արգումենտներ ստանալն ամենադժվարն է հենց Rust-ում, և գրառումն ավարտում է իր իսկ pre-RFC-ով։
Ինչպես են դա լուծում այլ լեզուներ
Dart-ը, որը նախատեսված է գրաֆիկական ինտերֆեյսների համար, որտեղ բաղադրիչներն ունեն բազմաթիվ ոչ պարտադիր պարամետրեր, անվանված պարամետրերը փաթաթում է գանգուր փակագծերում և թույլ է տալիս լռելյայն արժեքներ ու `required` բառ. հեղինակի գնահատմամբ սա դիտարկված լեզուների լավագույն լուծումն է։ C#-ում ցանկացած պարամետր կարելի է անվանել կամ լռելյայն արժեք տալ, եթե այդ արժեքները գալիս են պարտադիրներից հետո։ TypeScript-ում անվանվածների համար պետք է ապամոնտաժել մեկ անանուն օբյեկտ, այսինքն՝ դաշտի անունները գրվում են երկու անգամ, ինչը հեղինակը համարում է ավելորդ բազմախոսություն։
Ինչ արժե այս բացը Rust-ին
Rust-ում սովորական լուծումը `Default`-ի իրականացմամբ առանձին պարամետրային կառույցն է, իսկ կանչը ավարտվում է `..Default::default()`-ով։ Հեղինակի կարծիքով սա ավելի վատ է, քան TypeScript-ի տարբերակը. տիպերը անանուն չեն, տիպին ոչ բնորոշ լռելյայն արժեքները պահանջում են ամբողջական ֆունկցիա, և եղանակը գործում է միայն բոլոր պարամետրերի լռելյայն արժեքների դեպքում։
Երեք ոչ պարտադիր պարամետրի համար՝ տարողություն, հեշավորիչ և բաշխիչ, ստանդարտ գրադարանի `HashMap`-ն ունի ութ կոնստրուկտոր, այդ թվում `new`, `with_capacity` և `_in` տարբերակներով `with_hasher`, և ֆունկցիաների թիվը աճում է էքսպոնենցիալ։ Հերթականությունը շփոթելը նույնպես հեշտ է. `fn print(text: &str, bold: bool, italics: bool, underline: bool)`-ում երկրորդ ու երրորդ արգումենտների տեղերը փոխելով՝ տեքստն աննկատ դառնում է թավ։
Հեղինակի առաջարկը
Նրա pre-RFC-ն անվանումը դարձնում է ընտրովի՝ պարամետրի անունից առաջ դնելով `pub` բանալի բառը՝ `fn print_labeled_measurement(pub value: i32, pub unit_label: char = 'm')`, ուստի կանչը կարող է լինել `print_labeled_measurement(value: 5)`։ Անվանված արգումենտները գալիս են դիրքայիններից հետո, բայց կարող են վերադասավորվել միմյանց միջև և ունենալ լռելյայն արժեքներ. `const` ֆունկցիաներում այն պետք է հաստատուն արտահայտություն լինի, սովորականներում հաշվարկվում է ինստանցիայի պահին։ Տրեյթները կարող են օգտագործել անվանված պարամետրեր, իրականացումները պետք է կրկնեն անունները, իսկ ֆունկցիայի ցուցիչներն ու `Fn` տրեյթները մնում են դիրքային։
Այլ տարբերակներ և բաց հարցեր
Հեղինակը դիտարկում է նաև իրեն ավելի վատ թվացող առաջարկները՝ կառույցի դաշտերի լռելյայն արժեքներ (արդեն Nightly Rust-ում է, ընդ որում նա գրել է `feluments` polyfill գրադարանը), կառուցվածքային գրառումներ, որոնք լեզվի թիմը չափազանց դժվար համարեց, Rust Internals Forum-ի երկար pre-RFC, որը լռելյայն արժեքների փոխարեն առաջարկում էր գերբեռնում, կետով սկսվող շարահյուսություն և C#-ի ոճի կրկնօրինակում։ Քանի որ անունները ոչ պարտադիր են, անվտանգությունը մնում է կարգապահության հարց. առաջարկվում են Clippy-ի լինթ կամ ապագա թողարկումում անունների պարտադրում։ Բաց են մնում արգումենտների հերթականությունը, `pub` բառի ընտրությունը և այն հարցը, թե արդյոք լռելյայն արժեքները միշտ պետք է `const` լինեն։
SiTech — AI-ով հզորացված վեբ մշակում
Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։