نتیجه result
برگرداندن «یا مقدار درست یا خطا» از یک روال، بهجای استثنا.
واردسازی نتیجه
سلام استثنا ندارد. روالی که ممکن است شکست بخورد، بهجای پرتاب خطا یک نتیجه برمیگرداند: یا موفق همراه با مقدار، یا خطا همراه با توضیح مشکل. صدازننده با همخوان هر دو حالت را بررسی میکند و مترجم نمیگذارد یکی از قلم بیفتد.
درون روالی که خودش نتیجه برمیگرداند، عملگر ? کار را کوتاه میکند: پس از یک فراخوانی، مقدار درست را بیرون میکشد و اگر خطا بود، همان خطا را بیدرنگ برمیگرداند. درس جداشمارها این الگو را قدمبهقدم توضیح میدهد.
گونهها
نتیجه Result
جداشمار نتیجه<T، E>:
موفق(value: T)
خطا(error: E)
پایانجداشماری عام با دو حالت.
T گونهی مقدار درست است و E گونهی خطا، که بیشتر وقتها رشته است. مقدارش را با نتیجه.نتیجه.موفق(...) یا نتیجه.نتیجه.خطا(...) بسازید.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| موفق | Ok | (value: T) | کار درست انجام شده و مقدارش در value است. |
| خطا | Err | (error: E) | کار انجام نشده و توضیح مشکل در error است. |
واردسازی نتیجه
روال سن(م: رشته): نتیجه.نتیجه<صحیح، رشته>:
ع := م.به صحیح()
اگر ع <= ۰ یا ع > ۱۵۰:
برگشت نتیجه.نتیجه.خطا("سن نامعتبر: " + م)
پایان
برگشت نتیجه.نتیجه.موفق(ع)
پایان
روال ریشه:
هر م در ["۳۰"، "۲۰۰"]:
ن := سن(م)
سرچاپ همخوان ن:
موفق(س) => "سن پذیرفته شد: " + س
خطا(پیام) => پیام
پایان
پایان
پایانخروجیسن پذیرفته شد: 30
سن نامعتبر: ۲۰۰
روالها
موفق است IsOk
روال موفق است<T، E>(r: نتیجه<T، E>): منطقیاگر نتیجه
موفق باشد، درست برمیگرداند.واردسازی نتیجه
روال تقسیم(الف: صحیح، ب: صحیح): نتیجه.نتیجه<صحیح، رشته>:
اگر ب == ۰:
برگشت نتیجه.نتیجه.خطا("تقسیم بر صفر")
پایان
برگشت نتیجه.نتیجه.موفق(الف / ب)
پایان
روال ریشه:
درستها := تقسیم(۹، ۳)
غلط := تقسیم(۱، ۰)
سرچاپ نتیجه.موفق است(درستها)، نتیجه.خطا است(درستها)
سرچاپ نتیجه.موفق است(غلط)، نتیجه.خطا است(غلط)
سرچاپ نتیجه.با پیش فرض(درستها، -۱)، نتیجه.با پیش فرض(غلط، -۱)
سرچاپ نتیجه.انتظار(درستها، "باید تقسیم میشد")
پایانخروجیtrue false
false true
3 -1
3
خطا است IsErr
روال خطا است<T، E>(r: نتیجه<T، E>): منطقیاگر نتیجه
خطا باشد، درست برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: result-IsOk.salam
با پیش فرض UnwrapOr
روال با پیش فرض<T، E>(r: نتیجه<T، E>، fallback: T): Tاگر نتیجه موفق باشد، مقدارش را برمیگرداند و اگر خطا باشد، مقدار پیشفرضی که دادهاید.
نمونهی این مورد همراه با موارد بالاتر آمده است: result-IsOk.salam
انتظار Expect
روال انتظار<T، E>(r: نتیجه<T، E>، msg: رشته): Tمقدار نتیجهی موفق را برمیگرداند. اگر نتیجه خطا باشد، برنامه با پیامی که دادهاید متوقف میشود؛ پس فقط جایی به کارش ببرید که مطمئنید خطا ممکن نیست.
نمونهی این مورد همراه با موارد بالاتر آمده است: result-IsOk.salam