اول ببینیم هرکدوم اینا به تنهایی چه معنی دارن
اگه پارامتر ورودی یه تابعی به شکل ref دریافت بشه، آدرس اون متغیر برای تابع ارسال میشه نه مقدارش
و اگه پارامتر ورودی یه تابعی به شکل out دریافت بشه، علاوه بر اینکه آدرس اون متغیر ارسال میشه، باید حتما مقداردهی اولیه بکنیمش وگرنه کامپایل ارور میگیریم.
برای درک بهتر یه مثال بزنم:
متغیر به اسم age تعریف کردم و مقدار اولیشو دادم 10
تابع multiply رو صدا میزنم و age رو بهش میدم. تو تابع مقدار عددمون رو 2 برابر میکنم اما تو خروجی 10 چاپ میشه. چون مقدار age برای تابع multiply ارسال شده و اگه داخل تابع مقدار رو تغییر بدیم، فقط داخل تابع تاثیرش باقی میمونه.
حالا تابع add رو اجرا میکنم و age رو به صورت ref بهش میدم. اینبار آدرس age برای تابع ارسال میشه. داخل تابع عددم رو بعلاوه 1 میکنم و در خروجی میبینیم که 11 چاپ میشه. چون آدرس age ارسال شده و تغییرات روش اعمال میشه
در آخر تابع out رو اجرا میکنم و age رو به صورت out بهش میدم. داخل تابع کامپایلر مجبورم میکنه اول عدد دریافتی رو مقدار دهی کنم و بعد ازش استفاده کنم و من هم این کارو میکنم و مقدار 5 بهش میدم. بعد هم یکی ازش کم میکنم و در خروجی برام عدد 4 چاپ میشه
درسته هردوی اینها آدرس متغیر رو ارسال میکنن ولی ref دوطرفه هست اما out یک طرفه
یعنی ref مقدار قبلی متغیر رو هم دریافت میکنه اما out کاری به مقدار قبلی نداره و دوباره مقداردهیش میکنه و طبیعتا مقدار قبلی پاک میشه.
پس زمانی از out استفاده کنین که مقدار فعلی متغیر براتون مهم نیست و فقط میخواین نتیجه یه کار یا پردازشی رو داخلش بریزین.
مثلا یه تابعی دارین که یه کاری انجام میده و یه نتیجه ای برمیگردونه. اما اگه درحال انجام این کار به ارور خورد، میتونه جزئیات ارور رو داخل ورودی که به صورت out گرفته ذخیره کنه