برای طرح سوال و دسترسی به آموزش ها  کانال ما در تلگرام بپویندید  

آموزش دارت: تعریف توابع و انواع پارامتر ها

به نام دانای بر حق

مقدمه

در این سری آموزش ها قصد داریم syntax زبان برنامه نویسی دارت Dart را با هم یاد بگیریم، برای دنبال کردن سری کلی این آموزش ها و دیدن قست ها اینجا کلیک کنید.

دارت زبان برنامه نویسی flutter می باشد برای نوشتن برنامه های native یعنی با کد محلی برای android و ios هم زمان با طراحی متریالز.

 

تعریف توابع در دارت

دارت یک زبان برنامه نویسی شی گرا می‌باشد، به همین خاطر توابع نیز در این زبان شیی های داری type می‌باشند، این به این معنی است که توابع را میتوان به متغییر ها نسبت داد یا به صورت آرگومان به تابع دیگر پاس داد. تعریف توابع بسیار شبیه توابع در زبان C است می‌باشد ولی کن شما می‌توانید برای آنها نوع تعریف نکنید و خروجی آن بدون مشکل نشان دهد.

تعریف اولین تابع:

bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

همانطور که میبینید در تابع تعریف شده بالا مقدار خروجی bool  تعریف شده و ورودی یک عدد از نوع int  می باشد دقیقا مثل c از return هم استفاده میشود برای بازگشت.

تابع بالا را به شکل زیر نیز میتوان تعریف کرد:

isNoble(atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

برای توابعی یک خطی میتوانید از دستور shorthand نیز به شکل زیر استفاده کنید:

bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;

در کد بالا معنای expr <=  درواقع به معنای { return expr; }  می‌باشد و <= گاهی اوقات به معنای فلش چاق نیز معرفی می‌شود.

 

پارامتر ها

درتوابع پارامتر های ارسالی معمولا به دو شکل هستند پارامتر های ضروری و پارامترهای دلخواه، که ابتدا باید توابع ضروری در ورودی فهرست شوند و سپس پارامتر های دلخواه بایستی لیست شوند.

پارامتر های دلخواه میتوانند از نوع named یا positional  باشند، اما هر دوی آنها نمیتواند باشد.

پارامترهای دلخواه named

برای استفاده از پارامتر دلخواه نامگذاری شده به شکل paramName: value عمل میکنیم به مثل زیر توجه کنید:

enableFlags(bold: true, hidden: false);

نحوه تعریف آن هم به شکل زیر است:

/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold, bool hidden}) {
  // ...
}

پارامتر های دلخواه positional

پارامتر های دلخواه جایگذاری شده به سادگی با محصور شدن توسط [] در آرگومان های ورودی تعریف میشوند به مقال زیر توجه کنید:

String say(String from, String msg, [String device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

در تابع بالا device به صورتی متنی و پارامتر های دلخواه جایگذاری شده تعریف شده است.

نکته: توجه داشته باشید پارامتر های جایگذاری شده را با آرایه های یعنی همان List ها اشتباه نگیرید.

نحوه استفاده از تابع بالا:

 say('Sadegh', 'Hamid') // Sadegh says Hamid
یا
Smoke signal say('Sadegh', 'Hamid','Smoke signal') // Sadegh says Hamid with

تعیین مقدار پیش فرض برای پارامتر

شما میتوانید هنگام تعریف تابع یک مقدار پیش فرض را به مساوی مانند php نسبت دهید، این موضوع شامل متغییر های جایگذاری شده و نام گذاری شده هر دو می باشد.

با هم به مثال زیر نگاهی بیاندازیم:

/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold = false, bool hidden = false}) {
  // ...
}

// bold will be true; hidden will be false.
enableFlags(bold: true);

استفاده از تابع به عنوان شی

با توجه به چیزی که در جلسه پیش مطرح کردیم، همه چیز شی است و این جلسه مطرح شد تابع قابل پاس دادن می‌باشد، حالا مثال زیر در مورد تابع زیر را با هم می‌بینیم:

void printElement(int element) {
  print(element);
}

var list = [1, 2, 3];

// Pass printElement as a parameter.
list.forEach(printElement);

در کد بالا لیستی داریم که توسط تابع هر عضو آن پرینت میشود.

نکته: از ویژگی های جالب در زبان دارت می باشد که ندانستنش میتواند در مطالعه سورس کد شما را سر در گم کند.

تابع نیز می‌تواند به به صورت متغییر نسبت داده شود به تابع زیر که از توع ناشناس میباشد که در قسمت بعدی توضیح آن مطرح میشود:

var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
print(loudify('hello'));

تابع بالا به صورت شورت هند با پارامتر msg تعریف شده است. که شکل رشته در جلسه مربوط به رشته نیز مطرح می‌شود.

توابع ناشناس

معمولا توابع نامگذاری شده هستند، مثل ()main اما شما میتوانید تابع هایی را بدون نام تعریف کنید که توابع ناشناس هستند. شما بایستی توابع ناشناس را به توابع نسبت دهید در این صورت می‌توانید تعریف مجدد و حتی آن‌ها از برنامه حذف کنید.

برای تریف تابع کافی است از الگوی زیر تبعیت کنیم:

([[Type] param1[, …]]) {
codeBlock;
};

 

به مثال زیر نگاهی می‌اندازیم تا تابع زیر را نحوه استفاده از آن رو مجددا ببینیم:

var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
  print('${list.indexOf(item)}: $item');
});

برای دیدن عملکرد آن به اینجا مراجعه کنید

در دارت متغییر‌ها در توابع زیر مجموعه قابل دسترسی هستند به مثال زیر توجه کنید:

bool topLevel = true;

void main() {
  var insideMain = true;

  void myFunction() {
    var insideFunction = true;

    void nestedFunction() {
      var insideNestedFunction = true;

      print(topLevel);
      print(insideMain);
      print(insideFunction);
      print(insideNestedFunction);
    }
  }
}

بازگشت به عنوان تابع در تابع

شما یک تابع را در خروجی تابع دیگر می‌توانید قرار دهید:

/// Returns a function that adds [addBy] to the
/// function's argument.
Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

void main() {
  // Create a function that adds 2.
  var add2 = makeAdder(2);

  // Create a function that adds 4.
  var add4 = makeAdder(4);

  print(add2(3));// 5
  print(add4(3)); // 7
}

تابع makeAdder یک تابعی است که خروجی تابع تولید میکند میزان اضافه شونده را در ورودی خود میگیرید.

مقایسه توابع

دو تابع در در مقایسه نسبت به خروجی ایشان مقایسه می‌شوند و حتی تابع با متغییر نیز مقایسه می‌شود

مثال:

foo() {}

(foo() == null)

نکته:  تابعی که به شکل بالا تعریف شود همواره null می باشد.

 

نظرات

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *