بایندینگ به وسیله‌ی if و else

همونطور که میدونیم، راسط (احتمالا باید فارسیش اینطوری نوشته بشه) static type هست و باید نوع متغیرها رو در زمان کامپایل بدونه. بنابراین، این کد ارور میده و کامپایل نمیشه:

let my_number = if true {
    42
} else {
    "forty two"
};

دلیلش هم واضحه. راسط نمیدونه چقدر حافظه بهش اختصاص بده و اصلا نمیدونه توی stack باید نگهش‌داره یا heap.

ولی با توجه به اینکه توی راسط قابلیت shadowing داریم و میتونیم type رو هم عوض کنیم، میشه این کد رو نوشت:

let my_number = if true {
    42
} else {
    12345 // some useless number
};

let my_number = if false {
    "forty two"
} else {
    "some useless string"
};

خوب اینم که همون شد. فقط کار ما سختتر شد و یه دیتایی توی stack رفت که دیگه به هیچ اسمی bind نشده.

واقعا راهی نیست برای کوتاه شدن این کد، یا من هنوز بلد نیستم؟

به نظر من شما اینجا بجای int تایپ

  Option<Int>

باید داشته باشید

هدف کدچیه
یک مثال بزنید

کد سکالا

val myNumber: Option[Int] = {
  if(some_condition) 
    Some(42)
  else
    None
}
1 Like

هدفی ندارم. فقط خواستم یه روز وقت بذارم داکیومنت rust رو از سایت خودش بخونم، تو صفحه ی مربوط به if به این رسیدم.

فقط برام سوال پیش اومد که چرا یه کم منعطفتر نیست توی شرایطی که واقعا یه آلترناتیو براش وجود داره.
من الان اگه ۲ بار بایندینگ انجام بدم، فقط کدم کثیف شده، به همون نتیجه رسیدم و احتمالا مقدار قدیمی my_number هم بعد از if دوم، gc میشه.

با option هم نمیشه. (شاید من بلد نیستم)

let my_number: Option<i32>= if true {
    Some(12)
} else {
    Some(1.3)
}; 

ارور:

error[E0308]: mismatched types
  --> src/main.rs:29:14
   |
29 |         Some(1.3)
   |              ^^^ expected i32, found floating-point number
   |
   = note: expected type `i32`
              found type `{float}`

اگه برای هردو حالت عدد داری option نمیخواهی
برای مثال بالا تایپ باید تایپ که بزرگ تر که شامل کوچک تره باشه
یعنی f32

let my_number = if true { 12.0 } else { 1.3 };

خوب دوست دارم از چیزی استفاده کنم که حجم کمتری روی رم میگیره (مثلا در شرایطی که دیتاست خیلی بزرگ داریم)
باید بیشتر مطالعه کنم و یه مقدار تست انجام بدم. شاید بشه با یه روش دیگه حلش کرد. مثلا یه if که اون بالا چک کنه ببینه نوع دیتا چی هست، بعد بریم سراع binding.

ممنون بابت توضیحات. فعلا فقط میخوام یه کم وقت بذارم ببینم فلسفه‌ی rust چیه.

1 Like

به نظر من برای اینکه چند بایت حفظ کنی کد رو پیچیده نکن rust خودش زمان کامپایل شدن خیلی از این کارها رو انجام میده

3 Likes