مقدار برگشتی از یک تابع
توابع، میتوانند مقدار برگشتی از هر نوع دادهای داشته باشند. این مقادیر میتوانند در محاسبات یا به دست آوردن یک داده مورد استفاده قرار بگیرند. در زندگی روزمره فرض کنید که کارمند شما یک تابع است و شما او را صدا میزنید و از او میخواهید که کار یک سند را به پایان برساند. سپس از او میخواهید که بعد از اتمام کارش سند را به شما تحویل دهد. سند همان مقدار برگشتی تابع است. نکته مهم در مورد یک تابع، مقدار برگشتی و نحوه استفاده شما از آن است. برگشت یک مقدار از یک تابع آسان است. کافیست در تعریف تابع به روش زیر عمل کنید :
fun methodName(): returnType { return value; }
returnType در اینجا نوع دادهای مقدار برگشتی را مشخص میکند (Float ،Int و …). در داخل بدنه تابع کلمه کلیدی return و بعد از آن یک مقدار یا عبارتی که نتیجه آن، یک مقدار است را مینویسیم. نوع این مقدار برگشتی باید از انواع ساده بوده و در هنگام نامگذاری تابع و بعد از پرانتزها و علامت دو نقطه ذکر شود. مثال زیر یک تابع که دارای مقدار برگشتی است را نشان میدهد:
1: fun calculateSum(): Int 2: { 3: val firstNumber = 10 4: val secondNumber = 5 5: 6: return firstNumber + secondNumber 7: } 8: 9: fun main(args: Array<String>) 10: { 11: val result = calculateSum() 12: 13: println("Sum is $result.") 14: }
Sum is 15.
همانطور که در خط 1 مثال فوق مشاهده میکنید هنگام تعریف تابع و بعد از علامت پرانتز بسته، از Int: استفاده کردهایم که نشان دهنده آن است که تابع ما دارای مقدار برگشتی از نوع اعداد صحیح است. در خطوط 3 و 4 دو متغیر تعریف و مقدار دهی شدهاند.
توجه کنید که این متغیرها، متغیرهای محلی هستند. و این بدان معنی است که این متغیرها در سایر توابع مانند تابع ()main قابل دسترسی نیستند و فقط در تابعی که در آن تعریف شدهاند، قابل استفاده هستند. در خط 6 جمع دو متغیر توسط دستور return برگشت داده میشود. در داخل تابع ()main یک متغیر به نام result در خط 11 تعریف میکنیم و تابع ()calculateSum را فراخوانی میکنیم.
تابع ()calculateSum مقدار 15 را بر میگرداند که در داخل متغیر result ذخیره میشود. در خط 13 مقدار ذخیره شده در متغیر result چاپ میشود. تابعی که در این مثال ذکر شد تابع کاربردی و مفیدی نیست. با وجودیکه کدهای زیادی در تابع بالا نوشته شده ولی همیشه مقدار برگشتی 15 است، در حالیکه میتوانستیم به راحتی یک متغیر تعریف کرده و مقدار 15 را به آن اختصاص دهیم. این تابع در صورتی کارامد است که پارامترهایی به آن اضافه شود که در درسهای آینده توضیح خواهیم داد. هنگامی که میخواهیم در داخل یک تابع از دستور if یا when استفاده کنیم باید خود این دستورات را با کلمه return برگشت دهیم. برای درک بهتر این مطلب به مثال زیر توجه کنید :
1: fun getNumber(): Int 2: { 3: print("Enter a number greater than 10: ") 4: val number = readLine() !!.toInt() 5: 6: return if (number > 10) 7: { 8: number 9: } 10: else 11: { 12: 0 13: } 14: } 15: 16: fun main(args: Array<String>) 17: { 18: val result = getNumber() 19: 20: println("Result = $result.") 21: }
Enter a number greater than 10: 11 Result = 11
Enter a number greater than 10: 9 Result = 0
در خطوط 14-1 یک تابع با نام ()getNumber تعریف شده است که از کاربر یک عدد بزرگتر از 10 را میخواهد. اگر عدد وارد شده توسط کاربر درست نباشد تابع مقدار صفر را بر میگرداند. اگر قسمت else دستور if و یا دستور return را از آن حذف کنیم در هنگام اجرای برنامه با پیغام خطا مواجه میشویم.
چون اگر شرط دستور if نادرست باشد (کاربر مقداری کمتر از 10 را وارد کند) برنامه به قسمت else میرود تا مقدار 0 را بر گرداند و چون قسمت else حذف شده است برنامه با خطا مواجه میشود و همچنین اگر دستور return حذف شود چون برنامه نیاز به مقدار برگشتی دارد، پیغام خطا میدهد. خطوط 13-6 را به صورت زیر هم می توان نوشت:
if (number > 10) { return number } else { return 0 }
و آخرین مطلبی که در این درس میخواهیم به شما آموزش دهیم این است که شما میتوانید از یک تابع که مقدار برگشتی ندارد، با استفاده از کلمه کلیدی return خارج شوید. استفاده از return باعث خروج از بدنه تابع و اجرای کدهای بعد از آن میشود:
1: fun testReturnExit() 2: { 3: println("Line 1 inside the method TestReturnExit()") 4: println("Line 2 inside the method TestReturnExit()") 5: 6: return 7: 8: //The following lines will not execute 9: println("Line 3 inside the method TestReturnExit()") 10: println("Line 4 inside the method TestReturnExit()") 11: } 12: 13: fun main(args: Array<String>) 14: { 15: testReturnExit() 16: println("Hello World!") 17: }
Line 1 inside the method TestReturnExit() Line 2 inside the method TestReturnExit() Hello World!
در برنامه بالا نحوه خروج از تابع با استفاده از کلمه کلیدی return و نادیده گرفتن همه کدهای بعد از این کلمه کلیدی نشان داده شده است. در پایان برنامه تابع تعریف شده (testReturnExit()) در داخل تابع ()main فراخوانی و اجرا میشود.