Смањите отисак вашег Руст кода и повећајте његову робусност помоћу генеричких типова.

Увек постоје нивои несигурности током развоја апликација, што може довести до грешака, посебно ако ваше функције прихватају одређене врсте аргумената. Да бисте смањили грешке због несигурности, можете користити Генерицс. Генерици пружају функционалност за креирање класа, функција и структура података за рад са различитим типовима.

Користећи генерике, можете креирати и дефинисати алгоритме и структуре података који могу да раде на више типова без писања сложеног кода и засебних имплементација за сваки тип. Генерици побољшавају поновну употребу и ефикасност кода, истовремено одржавајући безбедност и перформансе типа.

Коришћење генеричких типова у Руст-у

Руст-ов генерички тип може да интероперише са други Руст типови података. Дефинисаћете генеричке типове са угаоним заградама (<>), након којих следе два или више параметара.

Ево генеричког дефиниција структуре који узима два генеричка параметра типа:

струцтТачка
 {
// Т и У су генерички параметри типа које ће поља к и и
// претпоставити при инстанцирању
к: Т,
и: У,
}

У Тачка структура, Т, и У су параметри генеричког типа.

Можете да замените параметре генеричког типа са било којим типом података приликом инстанцирања:

фнглавни() {
дозволити ми_поинт = Тачка { к: Низ::од("Здраво"), и: Низ::од("свет") };

принтлн!(
„Вредност к моје_тачке је {}, а вредност и је {}.“,
ми_поинт.к,
ми_поинт.и
);
}

Тхе поента променљива је инстанца Тачка структура иницијализована типовима стрингова. Руст компајлер закључује о конкретним типовима Т и У на основу вредности на инстанцирању.

Границе особина за генеричке типове

Руст генерички типови могу да користе границе својстава да би осигурали безбедност типа. Особине су колекције метода које типови могу применити да би показали одређена понашања дефинисана за особину.

Границе особина одређују да генерички тип мора да имплементира једну или више особина.

Ево примера генеричке функције која враћа већу од две вредности са ограниченом особином која обезбеђује да упоређени типови имплементирају особину:

// Максимум је особина која дефинише метод за процену максимума од два
// врсте
особинаМаксимум {
фнмак(селф, остало: Селф) -> Селф;
}

// Имплементира особину `Максимум` за све типове који имплементирају
// особина `ПартиалОрд`.
имплПартиалОрд> Максимум за Т {
фнмак(селф, остало: Селф) -> Селф {
// враћа `селф` ако је већи од `отхер`; иначе, врати се
// `остало.`
акоселф > остало {
селф
} друго {
друго
}
}
}

фнглавни() {
дозволити а = 5;
дозволити б = 10;
дозволити највећи = Максимум:: мак (а, б);
принтлн!(„Највећа вредност је {}“, највећи);
}

Тхе Максимум особина има а мак метод који враћа већу од две вредности истог типа. Било који тип који имплементира ПартиалОрд особина спроводи Максимум особина.

Тхе мак метода узима две вредности од Селф тип—односи се на тип који имплементира Максимум особина—и упоређује вредности.

Тхе главни функција упоређује две променљиве користећи мак метода и штампа највећи.

Ограничења за генеричке типове

Ограничења су слична границама особина, али вам омогућавају да наведете додатне захтеве за типове које користите као параметре типа.

Ако желите да креирате генеричку функцију која прихвата типове за конверзију стрингова, можете користити ограничење да бисте осигурали да параметар типа имплементира особину.

// ТоСтринг је особина са методом конверзије стрингова
особинаТоСтринг {
фнто_стринг(&селф) -> Низ;
}

// то_стринг је генеричка функција која узима вредност било ког типа која
// имплементира особину ТоСтринг
фнто_стрингТоСтринг>(вредност: Т) -> Низ {
валуе.то_стринг()
}

Тхе то_стринг параметар вредности мора да имплементира ТоСтринг особина, која осигурава да можете конвертовати вредности типа Т нанизати са то_стринг методом.

Генерички типови су корисни за рад са особинама

Генерички типови за рђу су моћни и постоје области за побољшање. Критична област фокуса је побољшање перформанси генеричког кода. Тренутно, Руст-ов систем типова може наметнути додатне трошкове генеричком коду, успоравајући перформансе.

Генерички типови су корисни за рад са особинама. Користећи генеричке типове, можете креирати објекте особина који раде са било којим типом који имплементира особину како бисте ваше методе учинили флексибилнијим.