لزوم استفاده از فانکشن‌های divergent در Rust

سلام دوستان
امیدوارم خوب باشید

من در حال یادگیری زبان راست هستم. مبحث فانکشن‌های divergent رو نمی فهمم! چه لزومی داره این کار رو بکنیم؟

    fn diverges() -> i {
        panic!("This function never returns");
    }

این مثال رو خود کتاب راست زده. ولی نمی‌فهمم کجاها کاربرد داره؟! مگه نمیشه ماکروی panic رو هرجا خواستیم استفاده کنیم؟ چه لزومی داره فانکشن بنویسیم براش؟
اساتید ممنون میشم راهنمایی کنید
مرسی

1 Likes

در مورد panic مطالعه کردین؟

1 Likes

دیدم سام داره پاسخ میده گفتم صبر کنم تموم بشه بعد بیام :grin:

1 Likes

نه ولی در زبان گو دربارش خوندم. فکر می کنم همون نقش رو داره :thinking:

در اغلب زبان ها یک تایپ وجود داره که
هیچ تایپ دیگری از آنها ساخته نشدند
این تایپ ها تایپ bottom گفته می‌شوند
در راست دستور هایی که هیچ وقت به شاخه اصلی برنمیگردند و return نمیکنن مثل panic
از این نوع هستند و راست با فلسفه امنیت از segfault می‌خواد همیشه کنترل برنامه آشکارا انجام بشه

4 Likes

منظورتون رو زیاد متوجه نشدم :thinking:

کلا زبان Rust یک مقدار ادبیات جدید داره به نسبت زبان های بیشتر شناخته شده.
در ادبیات Rust عبارت Diverging Function چیز عجیبی نیست، خیلی ساده یعنی یک Function که چیزی Return نمیکنه.
اگر به زبان انگلیسی تسلط دارید در این لینک نکات خوبی گفته شده:

5 Likes

سپاس فراوان :pray:
الان می بینمش

و این با مثال
Diverging functions never return.

https://doc.rust-lang.org/rust-by-example/fn/diverging.html

2 Likes

اگر از دید ریاضی نگاه کنید divergence وقتی رخ میده که یک حد هیچ وقت به جواب نرسه
در راست فانکشنی که کنترل thread برنمیگردونه divergent گفته میشه

2 Likes

تا اینجاشو فهمیدم. مثل فانکشنی که توش حلقه بینهایت اجرا میشه و هرگز برنمی‌گرده. حالا سوالی که تو ذهنمه اینه که نوشتن ! بعد از امضای فانکشن کجای کار رو می گیره؟

! در راست یک سینتکس که نشان بده نوع فانکشن divergent هستش

1 Likes

در تکمیل حرف‌ @samdvr؛ نوشتن ! قراردادی هست

2 Likes

بازم تا اینجاشو فهمیدم :joy:
تو این توابع نوشتن ماکروی panic اجباریه یا نه؟

آیا بدون ! کمپایل میشه؟

آهااااااا علامت ! نقش throws در جاوا داره که بعد از امضای متد نوشته میشه و ماکروی panic مشابه بلوک try catch. درست گفتم؟

حدس درستی نیست. ! چیزیه که foo بر میگردونه, یا در اصل بر نمیگردونه! :smile:
کدهای زیرو در playground اجرا کن

fn main() {
    foo();
}

fn foo() -> ! {
    panic!("This call never returns.");
}
fn main() {
    foo();
}

fn foo() ->  {
    panic!("This call never returns.");
}
1 Likes

از دومی خطا گرفت:

error: expected type, found `{`
 --> src/main.rs:5:14
  |
5 | fn foo() ->  {
  |              ^

error: aborting due to previous error

error: Could not compile `playground`.

To learn more, run the command again with --verbose.
1 Likes

چون syntax بدون ! کامل نیست

1 Likes

! مثل i8 , u8 , bool نشان گر تایپه

2 Likes