Rust භාෂාවේ async method එකක් අඩංගු trait එකක් ලියලා, ඒ trait එකක් දෙකක් හෝ තවත් වර්ග සඳහා ක්රියාත්මක කරලා, ඒවා Vec එකකට එකතු කිරීමට උත්සාහ කළාම ඔබට "error[E0038]: the trait Notifier cannot be made into an object" වැනි පණිවිඩයක් දැක ගන්න පුළුවන්.
මෙම වැරදි පණිවිඩය පේනවාට හේතුව, සමාන්ය synchronous trait එකකට async method එකක් එකතු කරන විට object‑safety එක පූර්ණයෙන්ම කැඩීමයි. එනම්, async fn එකක් compile කරන විට එය Future ඉම්පලෙමෙන්ට් කරන state machine එකක් බවට පත් වේ, ඒ state machine එකේ concrete type එක අනාමික (anonymous) සහ implementor එකකට අනුව size එක වෙනස් වේ.
Object‑safety සඳහා ව්යුහමය (structural) අවශ්යතාවයක් තියෙන්නේ: ව්යුහයක් (vtable) එකේ සෑම method එකක්ම එකම size සහ layout එකක් ගන්නා බව. async method එකේ anonymous future type එක size එක වෙනස් වීම නිසා එම අවශ්යතාවය පුරා නොගනී. මෙය Rust සංවර්ධක කණ්ඩායම තවත් කාලයක් තුළ සකස් කිරීමට අදහස් නොකරයි.
ඒත් මෙය අඩුපාඩුවක් නොව, සැලකිලිමත් කරගත හැකි තේරීම් තුනක් ඇත. ඔබේ implementors ලැයිස්තුව සීමිත (closed) නම්, තෙවන පාර්ශව කේතයෙන් (third‑party) ලැබෙනවා නම්, හෝ ඔබේ library එකේ boxing වියදම ගැන සැලකිලිමත් නම්, වෙනස්‑වෙනස් විසඳුම් පරික්ෂා කළ හැක.
1. Boxed Future භාවිතය – async method එකේ return type එක Pin ලෙස නිර්දේශ කර, එය heap එකේ සුරකිමින් size එක එකසේ තබයි. මෙය සරලයි, නමුත් heap allocation එකක් සිදුවන බැවින් performance‑ට සලකුණු වේ.
2. Associated Type + Generic Trait Object – trait එකට associated type එකක් (type Fut: Future
3. Macro හෝ external crate (async‑trait) – async‑trait crate එක භාවිතා කර, compiler‑ට async method එකක් object‑safe ලෙස treat කිරීමට උපකාරී වේ. මෙය වැඩි dependency එකක් එක් කරනවා නමුත් code readability වැඩි කරයි.
ශ්රී ලංකාවට ඇති වැදගත්කම
ශ්රී ලංකාවේ විශ්වවිද්යාල සිසුන්, start‑up සංවර්ධකයින් හා IT සමාගම් සඳහා Rust හි async traits ගැටළුවේ නිවැරදි විසඳුම් දැනගැනීම අතිශය වැදගත්. පළමු විසඳුම (boxing) භාවිතා කරමින් performance‑ට අඩු බලපෑමක් ඇති නමුත් development speed එක ඉහළ ගත හැක. දෙවන පරිදි associated type භාවිතා කරමින් code එක තදබල කර ගත හැකි අතර, third‑party library සමඟ වැඩ කරන සමාගම් සඳහා එය සුදුසු වේ. තෙවැනි විකල්පය (async‑trait crate) open‑source ecosystem එකේ නවතම trends සමඟ සමාන්විතව ඉදිරියට යාමට අවස්ථාව ලබා දෙයි. එම නිසා, ලංකාවේ software engineering curriculum එකට Rust async patterns එකක් ඇතුළත් කිරීම, දේශීය IT talent එකේ international competitiveness එක වැඩි කරයි.
අවසානයේ, async traits object‑safety ගැටළුව තවත් අභියෝගයක් නොව, නිවැරදි architectural තේරීම් මගින් හොඳම performance සහ maintainability ලබා ගත හැකි අවස්ථාවක් බවට පත්වේ.