کاتلین از ابتدا : higher-order functions

تعریف

این قسمت بحث ما در مورد higher-order functions هست. اصولا higher-order function تابعی هست که خودش یک تابع رو به عنوان آرگومان دریافت یا return میکنه. توی کاتلین، توابع رو میشه با استفاده از لامبداها یا function refrenceها به صورت مقادیر درآورد. پس با این حساب به تابعی میگیم higher-order function که یک function یا لامبدا رو یا return کنه، یا دریافت کنه و یا هر دوی این قابلیتا رو داشته باشه. برای مثال تابع filter که یک تابع standard-library هست، یک تابع دستورشرطی رو دریافت میکنه، بنابراین یک تابع higher-order هست :

https://gist.github.com/sajjadyousefnia/d9c975484d7cc9d7f465765a6b8f1242

اگه یادتون باشه توی یکی از قسمت‌های قبلی آموزش کاتلین higher-order functionsای رو دیدیم که با استفاده از with و also و اینا تعریف شده بودن ( توی قسمت توابع استاندارد کاتلین ).

ه Function Types

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

https://gist.github.com/sajjadyousefnia/0e4a6c6a14b76ef26d881c481183a986

توی این مواردی که دیدید کامپایلر خودش به طور خودکار نوع داده‌ی متغییرهای sum و action رو infer یا نتیجه‌گیری میکنه. حالا یه نگاهی به حالتی میندازیم که بخوایم نوع داده‌ها رو به طور صریح و واضح اعلام کنیم.

تابعی که دو تا پارامتر int رو دریافت میکنه و یک متغییر int رو return میکنه.

https://gist.github.com/sajjadyousefnia/5930b9b42a4e577fb319f42e478a389b

تابعی که هیچ تابعی رو دریافت نمیکنه و یک مقداری رو return میکنه.

https://gist.github.com/sajjadyousefnia/90cc7822e88921cac5252bd0f3cfea36

پس همونطور که دیدید function typeها رو اینجوری تعریف میکنن.

کلیدواژه‌ی Unit رو هم اگه یادتون باشه یه چیزی شبیه void بود که وقتی ما اون رو توی function type میاریم یعنی هیچ مقدار خاصی return نمیشه. و موقع تعریف یک تابع قابل حذفه ولی زمان استفاده از function type باید حتما ذکرش کنیم.

توی این قسمت بعضی function typeهای nullable هم داریم که با استفاده از ? مشخص میشن، مثل پایینی :

https://gist.github.com/sajjadyousefnia/3a23b529c6964a3da1a26473b10bef41

فراخوانی یک higher-order function

توابع زیر رو در نظر بگیرید :

https://gist.github.com/sajjadyousefnia/7e5b38a1eea899dd3438e14259e351b3

میخوایم تابع ()circleOperation رو فراخوانی کنیم و متد ()calArea رو بهش بفرستیم ( یادتون باشه که اگه پارامترهای اون متدی که داریم میفرستیمش با پارامترهای اون متدی که تابع میخوادش یکی نباشه کدمون کامپایل نمیشه و ارور میده. )

برای فرستادن متد ()callArea به ()circleOperation لازمه تا از :: استفاده کنیم و () رو حذف کنیم.

https://gist.github.com/sajjadyousefnia/957b639ff83a0877bb5878ed11e8a074

استفاده از higher-order functions باعث میشه تا کدمون خواناتر و فهم اون راحتتر بشه.

لامبدا و higher-order functions

می‌تونیم یک لامبدا رو به یک higher-order function بفرستیم.

https://gist.github.com/sajjadyousefnia/2187975456244ee8dd566be6d763a60e

یادتون باشه که اگه لامبدا فقط یک آرگومان داشته باشه و نخواید اسم آرگومان رو بنویسید، میتونید از کلیدواژه‌ی it استفاده کنید.

ه Return کردن یک تابع

تابع higher-order علاوه بر دریافت آرگومان، میتونن یک تابعی رو هم return کنه.

https://gist.github.com/sajjadyousefnia/68fde2f2564e6209ccb6e4020a98649c

مثالش رو میتونید بالا ببینید که تابع multiplier میتونه یک تابعی رو return کنه که این تابع Return شده هر عددی که تابع multiplier گرفته رو ضربدر ورودی خودش کنه.

https://gist.github.com/sajjadyousefnia/7cc72f6ee2b239979f41cc33243b21d4

ما برای تست کردنش، عدد 2 رو به عنوان پارامتر factor فرستادیم و اون هم یک لامبدا رو return کرده - که این لامبدا وردیش double و خروجیش هم همینطور double هست - و تابع return شده، کلا هر مقداری رو که بگیره، دو برابرش میکنه. از توجهتون ممنونم.

کانال تلگرامی : [email protected]