در زبان دارت هر تابعی میتواند آرگومانهای خود را داشته باشد. برای تعریف تابع، نیاز است که حداقل نام و نوع آرگومانهای آن تعیین شود. در ادامه آرگومانهای ضروری در توابع در زبان دارت را معرفی میکنم
- نام: نام تابع باید برای فراخوانی آن استفاده شود. نام تابع نمیتواند با یک عدد شروع شود و باید با حروف بزرگ یا کوچک یا “_” شروع شود.
- نوع: نوع دادهای آرگومان باید مشخص شود. نوعهایی که در دارت قابل استفاده هستند عبارتند از: int ، double ، num ، bool ، String و غیره.
- پارامترهای الزامی: تعداد و نوع پارامترهایی که باید به تابع داده شود برای اجرای آن الزامی است و باید در تعریف تابع مشخص شوند.
- مقدار بازگشتی: در صورتی که تابع باید یک مقدار را به عنوان خروجی تولید کند، نوع دادهای این مقدار باید مشخص شود.
- بدون بازگشت: در صورتی که تابع هیچ مقداری را به عنوان خروجی تولید نمیکند، باید نوع خروجی را به صورت void مشخص کنید.
- مقدار پیشفرض: در صورتی که پارامتری برای تابع تعریف شده ولی در فراخوانی آن به آن پارامتر مقداری داده نشده باشد، میتوانید برای آن پارامتر یک مقدار پیشفرض تعیین کنید.
- پارامترهای اختیاری: پارامترهایی که در فراخوانی تابع داده نمیشوند، اختیاری هستند و در تعریف تابع با [ ] مشخص میشوند.
برای مثال یک تابع ساده با دو آرگومان ضروری و یک پارامتر اختیاری به صورت زیر تعریف میشود:
void printMessage(String message, int repeat, [bool isUppercase = false]) {
for (int i = 0; i < repeat; i++) {
if (isUppercase) {
print(message.toUpperCase());
} else {
print(message);
}
}
}
در این تابع، نام تابع “printMessage” است. دو آرگومان ضروری این تابع شامل یک رشته به نام “message” و یک عدد صحیح به نام “repeat” هستند. پارامتر اختیاری این تابع یک بولین به نام “isUppercase” است که به صورت پیشفرض false است. این تابع به عنوان خروجی هیچ مقداری تولید نمیکند، بنابراین نوع خروجی آن را با void مشخص کردهایم.
این تابع با دریافت یک رشته و یک عدد صحیح، رشته را تعداد مشخصی بار چاپ میکند. در صورتی که پارامتر اختیاری isUppercase برابر true باشد، رشته به صورت بزرگترین حروف چاپ میشود.
برای فراخوانی این تابع میتوانید از روش زیر استفاده کنید:
printMessage("Hello", 3); // چاپ سه بار "Hello"
printMessage("Hi", 2, true); // چاپ دو بار "HI"
در فراخوانی دوم پارامتر اختیاری isUppercase برابر true تعیین شده است. به عبارت دیگر، در این حالت رشته “Hi” به صورت بزرگترین حروف چاپ خواهد شد.
آرگومانهای ضروری در توابع دارت میتوانند دارای هر نوع دادهایی باشند، از جمله رشته، عدد، بولین، لیست، مپ و غیره. همچنین، میتوانید تعدادی پارامتر اختیاری را در تابع تعریف کنید که برای استفاده از آنها، میتوانید به صورت نامی پارامتر را مشخص کنید.
به عنوان مثال تابع زیر یک لیست از اعداد را دریافت میکند و میانگین آنها را محاسبه میکند. این تابع دو پارامتر اختیاری دارد، اولی “round” که به صورت پیشفرض false است و اگر برابر true باشد، میانگین به صورت صحیح گرد میشود. پارامتر دوم “precision” است که تعیین میکند چند رقم اعشار باید نمایش داده شود. این پارامتر نیز به صورت پیشفرض برابر 2 قرار دارد.
double calculateAverage(List<double> numbers, {bool round = false, int precision = 2}) {
double sum = 0.0;
for (double number in numbers) {
sum += number;
}
double average = sum / numbers.length;
if (round) {
average = average.roundToDouble();
} else {
average = double.parse(average.toStringAsFixed(precision));
}
return average;
}
برای فراخوانی این تابع، میتوانید به صورت زیر عمل کنید:
List<double> numbers = [3.5, 2.7, 4.1, 5.2];
double avg1 = calculateAverage(numbers); // 3.38
double avg2 = calculateAverage(numbers, round: true); // 3.0
double avg3 = calculateAverage(numbers, precision: 1); // 3.4
در فراخوانی دوم، پارامتر اختیاری round برابر true تعیین شده است، بنابراین میانگین به صورت صحیح گرد شده است. در فراخوانی سوم، پارامتر اختیاری precision برابر 1 قرار داده شده است، بنابراین میانگین به یک رقم اعشار نمایش داده میشود در توابع دارت، میتوانید پارامترهای اجباری و اختیاری را با هم ترکیب کنید. برای مثال، در تابع زیر، پارامتر اول باید حتما یک رشته باشد، اما پارامتر دوم و سوم اختیاری هستند و اگر مقداری به آنها اختصاص داده نشود، به صورت پیشفرض به مقدار null تنظیم میشوند:
void printInfo(String name, {int age, String address}) {
print('Name: $name');
if (age != null) {
print('Age: $age');
}
if (address != null) {
print('Address: $address');
}
}
برای فراخوانی این تابع، میتوانید به صورت زیر عمل کنید:
printInfo('Reza'); // Name: Reza
printInfo('Erfan', age: 25); // Name: Erfan, Age: 25
printInfo('Ahmad', age: 30, address: '123 Teh St'); // Name: omid, Age: 30, Address: 123 Shiraz St
در فراخوانی اول فقط پارامتر اجباری name مشخص شده است. در فراخوانی دوم، پارامتر اجباری name و پارامتر اختیاری age با مقدار 25 مشخص شده است. در فراخوانی سوم، هر سه پارامتر به صورت نامی مشخص شدهاند.
در توابع دارت میتوانید پارامترهای لیستی نیز داشته باشید. برای مثال، تابع زیر یک لیست از اعداد صحیح را گرفته و بزرگترین عدد آنها را برمیگرداند:
int findMax(List<int> numbers) {
int max = numbers[0];
for (int i = 1; i < numbers.length; i++) {
if (numbers[i] > max) {
max = numbers[i];
}
}
return max;
}
برای فراخوانی این تابع، باید یک لیست از اعداد صحیح به آن ارسال کنید:
List<int> numbers = [5, 10, 3, 8, 1];
int maxNumber = findMax(numbers);
print('Max number: $maxNumber'); // Max number: 10
در مثال قبل لیست numbers شامل اعداد صحیح است و به تابع findMax ارسال شده است. سپس تابع findMax این لیست را دریافت کرده و بزرگترین عدد آن را با استفاده از حلقه for پیدا کرده و به عنوان خروجی برگردانده است.
در توابع دارت میتوانید پارامترهای نامگذاری شده را به شکل دیکشنری نیز داشته باشید. برای مثال، تابع زیر یک دیکشنری از اطلاعات یک فرد (نام، سن و آدرس) را گرفته و این اطلاعات را به صورت یک رشته فرمت شده برمیگرداند:
String formatInfo({String name, int age, String address}) {
String info = '';
if (name != null) {
info += 'Name: $name\n';
}
if (age != null) {
info += 'Age: $age\n';
}
if (address != null) {
info += 'Address: $address\n';
}
return info;
}
برای فراخوانی این تابع، میتوانید به صورت زیر عمل کنید:
String formattedInfo = formatInfo(name: 'Erfan', age: 25, address: '123 Teh St');
print(formattedInfo);
در مثال قبل پارامترهای تابع با نامگذاری شدهاند و میتوانید به صورت نامی به آنها مقدار دهید. سپس تابع formatInfo این پارامتره
اگر پارامتر نامگذاری نشده با یک مقدار پیشفرض مقداردهی شده باشد میتوانید این پارامتر را در فراخوانی تابع نادیده بگیرید. برای مثال، تابع زیر دو پارامتر name و age دارد، اما پارامتر age با مقدار پیشفرض 18 مقداردهی شده است:
String greet({String name, int age = 18}) {
if (name != null) {
return 'Hello, $name! You are $age years old.';
} else {
return 'Hello, Anonymous! You are $age years old.';
}
}
اگر مقدار پارامتر age در فراخوانی تابع مشخص نشود، مقدار پیشفرض آن (یعنی 18) برای این پارامتر استفاده خواهد شد:
String greeting1 = greet(name: 'Erfan', age: 25);
print(greeting1); // Hello, Reza! You are 25 years old.
String greeting2 = greet(name: 'Emily');
print(greeting2); // Hello, Emily! You are 18 years old.
در مثال بالا در فراخوانی تابع greet، برای پارامتر age در دو مرتبه از مقدار پیشفرض آن استفاده شده است. در مرتبه اول، مقدار age با مقدار دلخواه 25 مقداردهی شده است، و در مرتبه دوم، مقدار age به صورت نامگذاری نشده است و مقدار پیشفرض آن (یعنی 18) برای این پارامتر استفاده شده است.
توجه داشته باشید که در توابع دارت، میتوانید پارامترهای مختلفی را با هر نوع دادهای که تمایل دارید، دریافت کنید، از جمله اعداد، رشتهها، لیستها، توابع و حتی ترکیبهایی از این دادهها. بسته به نوع پارامترهایی که به یک تابع میدهید، میتوانید توابع با قابلیت استفاده بیشتر و بهبود یافته ایجاد کنید.