زبان برنامهنویسی دارت یک زبان شیءگرا است که برای توسعه برنامههای اندروید، وب و موبایل طراحی شده است. توابع در دارت بخشی مهم از برنامهنویسی هستند که به شما اجازه میدهند کدهای تکراری را در یک مکان ذخیره کنید و آنها را در بخشهای مختلف از برنامهتان استفاده کنید.
در اینجا نحوه نوشتن توابع در دارت را به شما آموزش خواهیم داد:
تعریف تابع
تعریف تابع در دارت به شکل زیر است:
نوع_برگشتی نام_تابع(پارامترها){
// بدنه تابع
}
در اینجا:
نوع_برگشتی
: نوع مقداری است که تابع برمیگرداند. ممکن است نوع برگشتیvoid
باشد که به این معنی است که تابع هیچ مقداری را برنمیگرداند.نام_تابع
: نام تابع که به شما کمک میکند آن را در بخشهای دیگر از برنامه استفاده کنید.پارامترها
: پارامترهایی هستند که به تابع ارسال میشوند. این پارامترها میتوانند یک یا چند مقدار باشند.
مثال
بیایید یک تابع ساده به نام sum
بنویسیم که دو عدد را به عنوان پارامتر دریافت کند و مجموع آنها را برگرداند:
int sum(int a, int b) {
int result = a + b;
return result;
}
در این تابع، نوع برگشتی int
است چون مجموع دو عدد نیز یک عدد است. پارامترهای تابع نیز دو عدد a
و b
هستند. در بدنه تابع، دو عدد جمع میشوند و سپس مقدار جمع به عنوان تابع sum
را میتوان به صورت زیر فراخوانی کرد:
void main() {
int a = 2, b = 3;
int result = sum(a, b);
print(result); // 5
}
در این قطعه کد، مقدار دو عدد 2
و 3
به عنوان پارامترهای تابع sum
ارسال میشوند. سپس مقدار برگشتی تابع در متغیر result
ذخیره میشود و در نهایت با استفاده از تابع print
چاپ میشود.
پارامترهای پیشفرض
در دارت، میتوانید پارامترهایی را به تابع بدهید که اگر ارسال نشوند، مقدار پیشفرضی را خواهند داشت. برای این کار، مقدار پیشفرض را در تعریف تابع به صورت زیر قرار دهید:
نوع_برگشتی نام_تابع({پارامترها = مقدار_پیش_فرضی}) {
// بدنه تابع
}
در اینجا، {}
برای نشان دادن این استفاده میشود که پارامترها اختیاری هستند و اگر ارسال نشوند، مقدار پیشفرض آنها استفاده خواهد شد.
مثال
بیایید تابع printFullName
را در نظر بگیریم که نام و نام خانوادگی را به عنوان پارامتر دریافت کرده و در خروجی نمایش دهد. اگر نام خانوادگی مشخص نشود، مقدار پیشفرض Doe
را برای آن در نظر بگیریم:
void printFullName(String firstName, {String lastName = 'Doe'}) {
print('$firstName $lastName');
}
در این تابع پارامتر firstName
باید ارسال شود، اما پارامتر lastName
اختیاری است. اگر lastName
ارسال نشود، مقدار پیشفرض Doe
استفاده خواهد شد.
تابع printFullName
را میتوان به صورت زیر فراخوانی کرد:
void main() {
printFullName('John'); // John Doe
printFullName('Jane', lastName: 'Smith
در این قطعه کد، دو بار تابع printFullName
فراخوانی شده است. در اولین فراخوانی، مقدار lastName
ارسال نشده است، بنابراین مقدار پیشفرض Doe
برای آن استفاده شده است. در دومین فراخوانی، مقدار lastName
به صورت پارامتر نامبرده شده و برای lastName
مقدار Smith
استفاده شده است.
پارامترهای الزامی
همانطور که پیشتر گفته شد، در تعریف تابع، میتوانید پارامترهایی را الزامی کنید. اگر پارامتری الزامی باشد و ارسال نشود، خطایی به نام MissingRequiredArgument
رخ میدهد.
مثال
بیایید تابع printInfo
را در نظر بگیریم که سن، ایمیل و شماره تلفن را به عنوان پارامترها دریافت کرده و در خروجی نمایش میدهد. سن را به عنوان پارامتر الزامی در نظر بگیرید:
void printInfo(int age, {String? email, String? phoneNumber}) {
print('Age: $age');
if (email != null) {
print('Email: $email');
}
if (phoneNumber != null) {
print('Phone Number: $phoneNumber');
}
}
در این تابع، پارامتر age
الزامی است و باید ارسال شود. اما پارامترهای email
و phoneNumber
اختیاری هستند و ممکن است ارسال نشوند.
تابع printInfo
را میتوان به صورت زیر فراخوانی کرد:
void main() {
printInfo(25, email: 'john@example.com'); // Age: 25 Email: john@example.com
printInfo(30, phoneNumber: '1234567890'); // Age: 30 Phone Number: 1234567890
printInfo(35); // Error: MissingRequiredArgument: The required positional argument 'age' was not provided.
}
در این قطعه کد، در دو مثال اول، پارامتر age
به عنوان پارامتر الزامی ارسال شده است و پارامترهای email
و phoneNumber
به صورت اختیاری ارسال شدهاند. در مثال سوم، پارامتر age
ارسال نشده است و خطای MissingRequiredArgument
رخ میدهد.
بازگشت مقدار
در تعریف تابع، میتوانید نوع مقداری را که تابع بازگردانده میکند، مشخص کنید. برای بازگشت مقدار، از کلید واژه return
استفاده میشود. در صورتی که تابع برگرداندن مقدار نداشته باشد، به طور خودکار مقدار null
بازگردانده میشود.
مثال
بیایید تابع add
را در نظر بگیریم که دو عدد را به عنوان پارامتر دریافت کرده و حاصل جمع آنها را به عنوان مقدار بازگردانده میکند:
int add(int a, int b) {
return a + b;
}
تابع add
را میتوان به صورت زیر فراخوانی کرد:
void main() {
int result = add(3, 5);
print(result); // 8
}
در این قطعه کد، تابع add
دو عدد را به عنوان پارامتر دریافت کرده و حاصل جمع آنها را به عنوان مقدار بازگردانده است. سپس مقدار بازگشتی تابع در متغیر result
ذخیره شده و با استفاده از تابع print
نمایش داده شده است.
توابع به عنوان پارامترها
در زبان دارت، میتوانید یک تابع را به عنوان پارامتر به یک تابع دیگر ارسال کنید. به عنوان مثال، فرض کنید که یک تابع به نام operate
داریم که دو عدد و یک تابع را به عنوان پارامتر دریافت میکند. این تابع، دو عدد را به تابع دریافت شده ارسال کرده و حاصل بازگشتی آن را به عنوان مقدار بازگردانده میکند.
int operate(int a, int b, int Function(int, int) operation) {
return operation(a, b);
}
تابع operate
سه پارامتر دارد. دو پارامتر اول a
و b
دو عدد هستند که به عنوان عملگرها به تابع دریافت شده ارسال میشوند و پارامتر سوم یک تابع با دو پارامتر int
است که مقدار بازگشتی آن نیز یک int
است. سپس دو عدد a
و b
به تابع operation
ارسال میشوند و حاصل بازگشتی آن به عنوان مقدار بازگشتی تابع operate
بازگردانده میشود.
حالا میتوانیم یک تابع ساده برای جمع دو عدد بنویسیم و آن را به عنوان پارامتر به تابع operate
ارسال کنیم:
int add(int a, int b) {
return a + b;
}
void main() {
int result = operate(3, 5, add);
print(result); // 8
}
در این قطعه کد، تابع add
یک تابع ساده برای جمع دو عدد است که به تابع operate
به عنوان پارامتر ارسال شده است. سپس تابع operate
دو عدد 3 و 5 و تابع add
را به عنوان پارامتر دریافت کرده و حاصل بازگشتی تابع add
یعنی 8 به عنوان مقدار بازگشتی تابع operate
بازگردانده شده است.
توابع بدون نام
در بعضی از موارد، ممکن است نیاز داشته باشید تا یک تابع را برای استفاده یکباره تعریف کنید. برای این منظور، میتوانید از توابع بدون نام استفاده کنید. یک تابع بدون نام (یا تابع مجهول) در واقع یک تابع است که نامی ندارد و مستقیماً در بدنه یک تابع دیگر تعریف میشود.
معمولاً توابع بدون نام به عنوان پارامترهایی برای توابع دیگر استفاده میشوند. به عنوان مثال، فرض کنید که یک لیست از اعداد صحیح داریم و میخواهیم به هر عضو آن یک عدد ثابت اضافه کنیم. میتوانیم از تابع forEach()
و تابع بدون نام استفاده کنیم تا این کار را انجام دهیم:
void main() {
List<int> numbers = [1, 2, 3, 4, 5];
int constant = 10;
numbers.forEach((int number) {
print(number + constant);
});
}
در این قطعه کد، تابع forEach
روی لیست numbers
صدا زده شده است. تابعی که به عنوان پارامتر به forEach
ارسال شده است، یک تابع بدون نام است که یک پارامتر از نوع int
دریافت میکند و عدد ثابت constant
را به آن اضافه کرده و حاصل را چاپ میکند.
انواع بازگشتی تابع
توابع در دارت میتوانند یکی از سه نوع بازگشتی داشته باشند: void
، dynamic
و نوع بازگشتی مشخص. در صورتی که تابعی void
باشد، هیچ مقداری به عنوان خروجی بازگردانده نمیشود و در واقع تابعی برای اجرای کارهای جانبی به کار میرود. به عنوان مثال، تابع print
یک تابع void
است که برای چاپ متنی در کنسول استفاده میشود.
توابعی که نوع بازگشتی خود را مشخص میکنند، یک مقدار از نوع مشخص به عنوان خروجی بازگردانده میکنند. برای مثال، تابع زیر یک عدد را به توان 2 میرساند و نتیجه را به عنوان یک عدد صحیح بازگردانده میکند:
int square(int x) {
return x * x;
}
توجه داشته باشید که نوع بازگشتی تابع باید با مقدار بازگشتی و تمام عبارات return
در تابع مطابقت داشته باشد. در غیر این صورت، کد شما با خطا مواجه خواهد شد.
توابعی که dynamic
را به عنوان نوع بازگشتی دارند، میتوانند هر نوع مقدار را به عنوان خروجی بازگردانند. این نوع توابع مفید است وقتی که نمیدانیم نوع دقیق مقدار بازگشتی چیست، یا ورودی تابع دارای نوع دقیق نیست. به عنوان مثال، تابع زیر یک لیست از اعداد صحیح را دریافت میکند و یک عدد رندوم از این لیست را بازگردانده میکند:
import 'dart:math';
dynamic randomElement(List<int> list) {
final randomIndex = Random().nextInt(list.length);
return list[randomIndex];
}
در این تابع، از کلاس Random
برای ساخت یک شیء رندوم استفاده شده است. سپس یک شماره رندوم بین 0 و طول لیست دریافت شده، تولید شده و عنصر متناظر با آن در لیست بازگردانده میشود. این تابع میتواند هر نوع مقداری را به عنوان خروجی بازگرداند، بنابراین نوع بازگشتی آن را dynamic
در نظر گرفتهایم.
مفاهیم مربوط به توابع در زبان برنامهنویسی دارت را آموزش دادیم. در این زبان، توابع به عنوان یک نوع از متغیرها به کار میروند و میتوانند به عنوان پارامترها و یا خروجیها به توابع دیگر ارسال شوند. همچنین، در دارت میتوانید از توابع بدون نام و توابع بازگشتی با نوع بازگشتی void
، dynamic
و نوع بازگشتی مشخص استفاده کنید. با آموزش دادن این مفاهیم، شما میتوانید توابعی پویا و قابل تنظیم برای برنامههای دارت خود بنویسید.