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


#1

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

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

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

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


#2

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


#3

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


#4

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


#5

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


#6

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


#7

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


#8

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


#9

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

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


#10

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


#11

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


#12

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


#13

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


#14

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


#15

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


#16

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


#17

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

fn main() {
    foo();
}

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

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

#18

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

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.

#19

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


#20

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