پرش به محتوا

استفاده از توابع در دارت

    زبان برنامه‌نویسی دارت یک زبان شیءگرا است که برای توسعه برنامه‌های اندروید، وب و موبایل طراحی شده است. توابع در دارت بخشی مهم از برنامه‌نویسی هستند که به شما اجازه می‌دهند کدهای تکراری را در یک مکان ذخیره کنید و آنها را در بخش‌های مختلف از برنامه‌تان استفاده کنید.

    در اینجا نحوه نوشتن توابع در دارت را به شما آموزش خواهیم داد:

    تعریف تابع

    تعریف تابع در دارت به شکل زیر است:

    نوع_برگشتی نام_تابع(پارامترها){
      // بدنه تابع
    }
    
    

    در اینجا:

    • نوع_برگشتی: نوع مقداری است که تابع برمی‌گرداند. ممکن است نوع برگشتی 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 و نوع بازگشتی مشخص استفاده کنید. با آموزش دادن این مفاهیم، شما می‌توانید توابعی پویا و قابل تنظیم برای برنامه‌های دارت خود بنویسید.

    5/5 - ( 1 امتیاز )

    دیدگاه شما نگاه ما رو عوض میکنه !

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

    پشتیبانی آنلاین