آشنایی با کاتلین بخش دوم (آموزش اصول مقدماتی)
فهرست مطالب
آخرین به روزرسانی در 21/10/2022
ما در این مقاله قصد داریم به بخش دوم از آشنایی با زبان کاتلین بپردازیم.
در بخش قبلی ما به یک سری مفاهیم پایه از کاتلین در حد معرفی و سپس ویژگی های آن پرداختیم.
در نهایت به استارت یک پروژه ی جستجوی کتاب برای کتابخانه با استفاده از کاتلین پرداختیم.
در این بخش قصد داریم بیشتر جنبه ی آموزشی را داشته باشیم و با منطق و سینتکس های زبان کاتلین آشنا بشویم.
این آموزش برای مبتدیان آماده شده است تا به آنها در درک اصول زبان برنامه نویسی کاتلین کمک کند.
پس از تکمیل این آموزش، خود را در سطح متوسطی از تخصص در کاتلین خواهید دید که از آنجا می توانید خود را به سطوح بعدی ببرید.
قبل از هر چیزی قصد اشاره ای به بازار کار کاتلین خواهیم داشت که چگونه شما به عنوان یک دولوپر زبان کاتلین
می توانید درآمدی را از کاتلین بدست آورید.
لازم به ذکر است پیش نیاز این آموزش تسلط بر زبان جاوا و درک مفاهیم آن می باشد.
بازار کار
تقاضای استخدام نیرو برای کاتلین بسیار زیاد است و همه شرکت های بزرگ برای توسعه اپلیکیشن های وب و موبایل خود به سمت کاتلین حرکت می کنند.
میانگین حقوق سالانه یک توسعه دهنده کاتلین حدود 130000 دلار است. (لازم به ذکر است این حقوق برای خارج از کشور بوده و در ایران توسعه دهنده ی اپلیکیشن به صورت حدودی مبلغی بین 10 تا 15 میلیون تومان به صورت ماهیانه می تواند دریافت کند.)
شرکت های بزرگی که از Kotlin استفاده می کنند به شرح زیر است:
- Amazon
- Netflix
- Uber
- Trello
- Coursera
- Basecamp
- Corda
- JetBrains
نصب کاتلین
همانطور که در بخش اول آشنایی با زبان کاتلین گفته شد ، یکی از ویژگی های کلیدی کاتلین این است که قابلیت همکاری با جاوا دارد، یعنی می توانید کدهای کاتلین و جاوا را در یک برنامه بنویسید.
مانند جاوا، کاتلین نیز بر روی JVM اجرا می شود، بنابراین برای نصب مستقیم Kotlin روی ویندوز و کار با آن با استفاده از خط فرمان، باید مطمئن شوید که JDK در سیستم خود نصب شده است.
Verify کردن نصب جاوا
برای تأیید نصب جاوا، command را باز کنید و نسخه فعلی جاوا را با استفاده از دستورjavac version ، تایید کنید.
C:\Users\TP>javac -version
javac 1.8.0_261
اگر جاوا را در سیستم خود نصب نکنید، خطای زیر رخ می دهد.
C:\Users\Krishna Kasyap>javac -v
‘javac’ is not recognized as an internal or external command,
operable program or batch file.
نصب JDK8
طبق تصویر زیر ، سایت Oracle Java Downloads را باز کنید.
بر روی لینک دانلود JDK در بخش Java SE 8 کلیک کنید.
با این کار به صفحه ای که شامل نرم افزار JDK برای پلتفرم های مختلف است هدایت می شوید، نسخه مورد نظر (exe.) را انتخاب کرده و آن را دانلود می کنید.
پس از دانلود فایل JDK (فرض کنید jdk_windows-x64_bin.exe را دانلود کرده ایم)، با اجرای آن، نصب را شروع کنید.
به طور پیش فرض جاوا در مسیر C:\Program Files\Java\jdk1.8.0_301\ نصب می شود که می توانید با کلیک بر روی دکمه Change مسیر را تغییر دهید.
پس از اتمام نصب بر روی دکمه Close کلیک کنید.
کامپایلر Command line کاتلین
کامپایلر خط فرمان Kotlin در صفحه انتشارات JetBrains Kotlin GitHub موجود است.
آخرین نسخه را دانلود کنید.
فایل دانلود شده را از حالت فشرده خارج کرده و در پوشه مورد نظر قرار دهید.
دایرکتوری Bin پوشه دانلود شده حاوی تمام فایل های باینری برای اجرای Kotlin است.
تنظیم متغیر path
روی My computer یا This PC کلیک راست کرده و Properties را انتخاب کنید.
روی Advanced System Settings کلیک کنید.
سپس روی دکمه Environment Variables کلیک کنید.
در پنجره Environment Variables، در قسمت System Variables، متغیر Path را انتخاب کرده و با استفاده از دکمه Edit متغیرها را ویرایش کنید.
بر روی دکمه New کلیک کنید و مسیر پوشه bin پوشه های JDK و Kotlin نصب شده را اضافه کنید.
برای تایید نصب، Command Prompt را باز کنید و دستور java یا javac را تایپ کنید، در صورت موفقیت آمیز بودن نصب، می توانید خروجی را مطابق شکل زیر مشاهده کنید:
تنظیم محیط کاتلین با استفاده از IntelliJ IDEA
Kotlin توسط JetBrains توسعه یافته است که IDE هایی مانند AppCode، CLion، DataGrip، DataSpell، GoLand، IntelliJ IDEA و … را توسعه می دهد.
IntelliJ IDEA دارای افزونه Kotlin همراه با آن است.
برای توسعه Kotlin IntelliJ را دانلود و نصب کنید.
برای نصب نسخه اخیر IntelliJ IDEA:
اگر فایل دانلود شده را اجرا کنید، فرآیند نصب شروع می شود.
پس از اتمام نصب ، و باز کردن برنامه تب Plugins IntelliJ را می بینید تمام پلاگین های موجود را نمایش می دهد.
به طور پیش فرض افزونه Kotlin فعال است، در هر صورت اگر فعال نشده باشد. تب افزونه را باز کنید، Kotlin را جستجو کرده و آن را نصب کنید.
برای ایجاد اولین اپلیکیشن، روی NewProject کلیک کنید.
Kotlin/JVM را انتخاب کرده و روی Next کلیک کنید.
پروژه را نامگذاری کنید و مکان مورد نظر را انتخاب کنید.
اکنون، یک فایل Kotlin جدید در زیر پوشه source(src) ایجاد کنید و نام آن را Test بگذارید.
می توانید یک تابع نمونه مانند شکل زیر ایجاد کنید.
همچنین می توانید با فشار دادن Ctrl + Shift + F10 این را اجرا کنید.
Architecture (معماری کاتلین)
Kotlin یک زبان برنامه نویسی است و معماری خاص خود را برای تخصیص حافظه و تولید خروجی با کیفیت به کاربر دارد.
در زیر سناریوهای مختلفی وجود دارد که کامپایلر Kotlin به طور متفاوتی کار می کند.
Kotlin را به bytecode کامپایل کنید که می تواند روی JVM اجرا شود.
این bytecode دقیقاً برابر با bytecode است که توسط فایل .class جاوا تولید می شود.
هر زمان که Kotlin جاوا اسکریپت را هدف قرار می دهد، کامپایلر Kotlin فایل .kt را به ES5.1 تبدیل می کند و یک کد سازگار برای جاوا اسکریپت تولید می کند.
کامپایلر Kotlin قادر به ایجاد کدهای سازگار با پلتفرم از طریق LLVM است.
Kotlin Multiplatform Mobile (KMM) برای ایجاد برنامه های کاربردی موبایل چند پلتفرمی با کد به اشتراک گذاشته شده بین اندروید و iOS استفاده می شود.
هر زمان که دو فایل byte coded (دو برنامه متفاوت از Kotlin و Java) روی JVM اجرا شوند، می توانند با یکدیگر ارتباط برقرار کنند و به این ترتیب یک ویژگی تعاملی در Kotlin برای جاوا ایجاد می شود.
Kotlin Native
Kotlin/Native یک فناوری برای کامپایل کد Kotlin به باینری های نیتیو است که می تواند بدون virtual machines اجرا شود.
Kotlin/Native از پلتفرم های زیر پشتیبانی می کند:
- سیستم عامل مک
- iOS، tvOS، watchOS
- لینوکس
- ویندوز (MinGW)
- اندروید NDK
و…
سینتکس ها
نقطه ورود برنامه Kotlin تابع () main است.
یک تابع را می توان به عنوان یک بلوک از کد طراحی شده برای انجام یک کار خاص تعریف کرد.
بیایید با یک برنامه اولیه Kotlin برای چاپ “!Hello, World ” شروع کنیم.
fun main() {
var string: String = "Hello, World!"
println("$string")
}
پارامترها
شکل دیگری از تابع () main تعداد متغیری از آرگومان های String را به صورت زیر می پذیرد:
fun main(args: Array){
println("Hello, world!")
}
اگر مشاهده کرده باشید، واضح است که هر دو برنامه خروجی یکسانی تولید می کنند، بنابراین ارسال یک پارامتر در تابع () main با شروع Kotlin نسخه 1.3 کاملا اختیاری است.
()print و () println
() println تابعی در Kotlin است که آرگومان خود را در خروجی استاندارد چاپ میکند، به همین ترتیب () println تابع دیگری است که آرگومان خود را بر روی خروجی استاندارد چاپ میکند، اما یک line break نیز در خروجی اضافه میکند.
بیایید برنامه زیر را امتحان کنیم تا تفاوت بین این دو عملکرد مهم را درک کنیم:
fun main(args: Array){
println("Hello,")
println(" world!")
print("Hello,")
print(" world!")
}
خروجی :
Hello,
world!
Hello, world
هر دو تابع ()print و ()println را می توان برای چاپ اعداد و همچنین رشته ها و همزمان برای انجام هر گونه محاسبات ریاضی مانند زیر استفاده کرد:
fun main(args: Array){
println( 200 )
println( "200" )
println( 2 + 2 )
print(4*3)
}
خروجی :
200
200
4
12
Semicolon در کاتلین
عبارات کد کاتلین مانند بسیاری از زبان های برنامه نویسی دیگر مانند جاوا، C++، C# و غیره به نقطه ویرگول (;) برای پایان دادن به دستور نیاز ندارند.
(لازم به ذکر است ما به برخی از مفاهیم پایه ی برنامه نویسی در کاتلین که مشابه با زبان های دیگر است را نخواهیم گفت و تنها به نکات اختصاصی این زبان می پردازیم.)
Keywords
کلمات کلیدی Kotlin کلمات از پیش تعریف شده و رزرو شده ای هستند که در برنامه نویسی Kotlin استفاده می شوند که معانی خاصی برای کامپایلر دارند.
این کلمات را نمی توان به عنوان یک شناسه استفاده کرد (نام متغیرها، نام پکیج ها، نام توابع و …) و در صورت استفاده، کامپایلر یک استثنا ایجاد می کند.
Kotlin از کلمه کلیدی fun برای تعریف یک تابع استفاده می کند، بنابراین اگر سعی کنیم از آن به عنوان نام متغیر استفاده کنیم، یک استثنا خواهد بود.
مثلا:
fun main() {
var fun = "Zara Ali" // Not allowed, throws an exception
var age = 19 // Valid variable name
println("Name = $fun")
println("Age = $age")
}
Kotlin یک زبان برنامه نویسی است و معماری خاص خود را برای تخصیص حافظه و تولید خروجی با کیفیت به کاربر دارد.
خروجی :
main.kt:2:7: error: expecting property name or receiver type
var fun = "Zara Ali" // Not allowed, throws an exception
^
main.kt:2:11: error: expecting '('
var fun = "Zara Ali" // Not allowed, throws an exception
^
main.kt:5:21: error: keyword cannot be used as a reference
println("Name = $fun")
کلمات کلیدی Kotlin به سه دسته کلی طبقه بندی می شوند:
- کلمات کلیدی Hard
- کلمات کلیدی Soft
- کلمات کلیدی Modifier
به عنوان یک تمرین خوب برنامه نویسی، به شدت توصیه می شود در هنگام کدنویسی در Kotlin از هیچ یک از کلمات کلیدی ذکر شده برای نام گذاری هیچ شناسه ای استفاده نکنید.
در زیر لیستی از کلمات کلیدی Hard وجود دارد که نمی توان از آنها به عنوان شناسه استفاده کرد:
as | ?as | break | class |
continue | do | else | false |
for | fun | if | in |
!in | interface | is | !is |
null | object | package | return |
super | this | throw | true |
try | typealias | typeof | val |
var | when | while |
کلمات کلیدی Soft :
by | catch | constructor | delegate |
dynamic | field | file | finally |
get | import | init | param |
property | receiver | set | setparam |
value | where |
کلمات کلیدی Modifier :
در زیر لیستی از نشانهها آمده است که به عنوان کلیدواژه در فهرستهای Modifier اعلانها عمل میکنند و میتوانند به عنوان شناسه در زمینههای دیگر استفاده شوند:
actual | abstract | annotation | companion |
const | crossinline | data | enum |
expect | external | final | infix |
inline | inner | internal | lateinit |
noinline | open | operator | out |
override | private | protected | public |
reified | sealed | suspend | tailrec |
vararg |
متغیرهای کاتلین
متغیرها بخش مهمی از هر زبان برنامه نویسی هستند.
آنها نام هایی هستند که به مکان های حافظه رایانه می دهید که برای ذخیره مقادیر در یک برنامه رایانه ای استفاده می شوند و بعداً از آن نام ها برای بازیابی مقادیر ذخیره شده و استفاده از آنها در برنامه خود استفاده می کنید.
متغیرهای Kotlin با استفاده از کلمات کلیدی var یا val ایجاد میشوند و سپس از علامت برابر = برای تخصیص یک مقدار به متغیرهای ایجاد شده استفاده میشود.
Syntax
در زیر یک دستور ساده برای ایجاد دو متغیر و سپس اختصاص مقادیر مختلف به آنها وجود دارد:
var name = "Zara Ali"
var age = 19
var height = 5.2
مثال
هنگامی که یک متغیر ایجاد می شود و یک مقدار به آن اختصاص می یابد، بعداً می توانیم با استفاده از نام آن به صورت زیر به مقدار آن دسترسی پیدا کنیم.
fun main() {
var name = "Zara Ali"
var age = 19
println(name)
println(age)
}
خروجی :
Zara Ali
19
بیایید یک مثال دیگر را ببینیم که در آن با استفاده از علامت دلار به مقادیر متغیر دسترسی خواهیم داشت:
fun main() {
var name = "Zara Ali"
var age = 19
println("Name = $name")
println("Age = $age")
}
خروجی :
Name = Zara Ali
Age = 19
متغیرهای قابل تغییر کاتلین
متغییر به این معنی است که می توان آنرا پس از تخصیص اولیه به مقدار دیگری تخصیص داد.
برای اعلام یک متغیر قابل تغییر، از کلمه کلیدی var همانطور که در مثال های بالا استفاده کردیم استفاده می کنیم:
خروجی :
fun main() {
var name = "Zara Ali"
var age = 19
println("Name = $name")
println("Age = $age")
name = "Nuha Ali"
age = 11
println("Name = $name")
println("Age = $age")
}
متغیر های Read-only در کاتلین
یک متغیر Read-only را می توان با استفاده از val ( به جای var) اعلام کرد و هنگامی که یک مقدار اختصاص داده شد، نمی توان آن را دوباره تخصیص داد.
انواع داده ها در کاتلین
نوع داده Kotlin یک طبقه بندی از داده ها است که به کامپایلر می گوید برنامه نویس چگونه قصد استفاده از داده ها را دارد.
به عنوان مثال، داده های Kotlin می تواند عددی، رشته ای، بولی و .. باشد.
کاتلین همه چیز را به عنوان یک شی در نظر می گیرد، به این معنی که ما می توانیم توابع و properties را روی هر متغیری فراخوانی کنیم.
Kotlin یک زبان تایپ ایستا است، به این معنی که نوع داده هر عبارت باید در زمان کامپایل شناخته شود.
Kotlin ساخته شده در نوع داده را می توان به صورت زیر دسته بندی کرد:
- Number
- Character
- String
- Boolean
- Array
انواع داده های شماره ای در کاتلین
انواع داده اعداد کاتلین برای تعریف متغیرهایی استفاده می شود که دارای مقادیر عددی هستند و آنها به دو گروه تقسیم می شوند:
انواع عدد صحیح اعداد کامل را ذخیره می کنند، مثبت یا منفی
انواع اعداد اعشاری
جدول زیر تمام انواع داده های عددی کاتلین، کلمات کلیدی برای تعریف انواع متغیر آنها، اندازه حافظه گرفته شده توسط متغیرها، و محدوده مقادیر قابل ذخیره در آن متغیرها را فهرست می کند.
Data Type | Size (bits) | Data Range |
Byte | 8 bit | -128 to 127 |
Short | 16 bit | -32768 to 32767 |
Int | 32 bit | -2,147,483,648 to 2,147,483,647 |
Long | 64 bit | -9,223,372,036,854,775,808 to +9,223,372,036,854,775,807 |
Float | 32 bit | 1.40129846432481707e-45 to 3.40282346638528860e+38 |
Double | 64 bit | 4.94065645841246544e-324 to 1.79769313486231570e+308 |
انواع داده کارکتری کاتلین
نوع داده کاراکتر Kotlin برای ذخیره یک کاراکتر استفاده می شود و آنها با کلمه کلیدی Char نشان داده می شوند.
یک مقدار Char باید با گیومه های تکی احاطه شود، مانند ‘A’
مثال :
fun main(args: Array) {
val letter: Char // defining a Char variable
letter = 'A' // Assigning a value to it
println("$letter")
}
داده های رشته ای کاتلین :
نوع داده رشته ای برای ذخیره دنباله ای از کاراکترها استفاده می شود.
مقادیر رشته باید با گیومه های دوتایی (” “) یا سه گانه (“”” “””) احاطه شوند.
ما دو نوع رشته در Kotlin داریم ؛ یکی به نام Escaped String و دیگری به نام Raw String.
رشته Escaped در داخل گیومه دوگانه (” “) اعلام می شود و ممکن است شامل کاراکترهای فرار مانند ‘\n’، ‘\t’، ‘\b’ و .. باشد.
رشته Raw در گیومه سه گانه (“”” “””) اعلام می شود و ممکن است حاوی چندین خط متن بدون هیچ گونه کاراکتر فرار باشد.
fun main(args: Array) {
val escapedString : String = "I am escaped String!\n"
var rawString :String = """This is going to be a
multi-line string and will
not have any escape sequence""";
print(escapedString)
println(rawString)
}
خروجی :
I am escaped String!
This is going to be a
multi-line string and will
not have any escape sequence
Boolean :
Boolean مانند سایر زبان های برنامه نویسی بسیار ساده است.
ما فقط دو مقدار برای نوع داده Boolean داریم : true یا false.
fun main(args: Array) {
val A: Boolean = true // defining a variable with true value
val B: Boolean = false // defining a variable with false value
println("Value of variable A "+ A )
println("Value of variable B "+ B )
}
نوع داده ی آرایه ها در کاتلین :
آرایه های کاتلین مجموعه ای از داده های همگن هستند.
آرایه ها برای ذخیره چندین مقدار در یک متغیر به جای اعلام متغیرهای جداگانه برای هر مقدار استفاده می شوند.
ما آرایه را در یک بخشی جداگانه به صورت مفصل خواهیم گفت، در حال حاضر اجازه دهید به یک مثال برای تعریف آرایه ای از اعداد صحیح و سپس دسترسی به یکی از المان های آن نگاه کنیم.
fun main(args: Array) {
val numbers: IntArray = intArrayOf(1, 2, 3, 4, 5)
println("Value at 3rd position : " + numbers[2])
}
نوع داده ی Conversion در کاتلین :
Conversion نوع فرآیندی است که در آن مقدار یک نوع داده به نوع دیگری تبدیل می شود.
کاتلین از تبدیل مستقیم یک نوع داده عددی به نوع دیگر پشتیبانی نمی کند، به عنوان مثال، امکان تبدیل نوع Int به نوع Long وجود ندارد:
fun main(args: Array) {
val x: Int = 100
val y: Long = x // Not valid assignment
println(y)
}
خروجی :
main.kt:3:18: error: type mismatch: inferred type is Int but Long was expected
val y: Long = x // Not valid assignment
برای تبدیل یک نوع داده عددی به نوع دیگر، کاتلین مجموعه ای از توابع را ارائه می دهد:
- ()toByte
- ()toShort
- ()toInt
- ()toLong
- ()toFloat
- ()toDouble
- ()toChar
حالا بیایید یک بار دیگر مثال بالا را بازنویسی کنیم و سعی کنیم آن را اجرا کنیم:
fun main(args: Array) {
val x: Int = 100
val y: Long = x.toLong()
println(y)
}
خروجی :
100
Operators
عملگر نمادی است که به کامپایلر می گوید دستکاری های ریاضی یا منطقی خاصی را انجام دهد.
Kotlin از نظر operators داخلی غنی است و انواع عملگرهای زیر را ارائه می دهد:
- Arithmetic Operators
- Relational Operators
- Assignment Operators
- Unary Operators
- Logical Operators
- Bitwise Operations
عملگرهای Arithmetic
عملگرهای حسابی کاتلین برای انجام عملیات ریاضی پایه مانند جمع، تفریق، ضرب و تقسیم و … استفاده می شوند.
Operator | Name | Description | Example |
+ | Addition | Adds together two values | x + y |
– | Subtraction | Subtracts one value from another | x – y |
* | Multiplication | Multiplies two values | x * y |
/ | Division | Divides one value by another | x / y |
% | Modulus | Returns the division remainder | x % y |
عملگرهای Relational ( رابطه ای)
Operator | Name | Example |
> | greater than | x > y |
< | less than | x < y |
>= | greater than or equal to | x >= y |
<= | less than or equal to | x <= y |
== | is equal to | x == y |
!= | not equal to | x != y |
عملگرهای Assignment
عملگرهای Assignment کاتلین برای تخصیص مقادیر به متغیرها استفاده می شوند.
در زیر مثالی وجود دارد که در آن از عملگر انتساب = برای تخصیص مقادیر به دو متغیر استفاده کردیم:
fun main(args: Array) {
val x: Int = 40
val y: Int = 20
println("x = " + x)
println("y = " + y)
}
خروجی :
x = 40
y = 20
در زیر لیستی از تمام assignment operators آمده است:
Operator | Example | Expanded Form |
= | x = 10 | x = 10 |
+= | x += 10 | x = x – 10 |
-= | x -= 10 | x = x – 10 |
*= | x *= 10 | x = x * 10 |
/= | x /= 10 | x = x / 10 |
%= | x %= 10 | x = x % 10 |
عملگرهای Unary :
عملگرهای Unary فقط به یک operand نیاز دارند.
آنها عملیات مختلفی مانند افزایش/کاهش یک مقدار، نفی یک عبارت، یا معکوس کردن مقدار یک بولی را انجام می دهند.
لیست Unary ها در زیر آمده است:
Operator | Name | Example |
+ | unary plus | +x |
– | unary minus | -x |
++ | increment by 1 | ++x |
— | decrement by 1 | –x |
! | inverts the value of a boolean | !x |
مثال :
fun main(args: Array) {
var x: Int = 40
var b:Boolean = true
println("+x = " + (+x))
println("-x = " + (-x))
println("++x = " + (++x))
println("--x = " + (--x))
println("!b = " + (!b))
}
خروجی :
x = 40+
x = -40-
x = 41++
x = 40–
b = false!
در اینجا عملگرهای افزایشی (++) و کاهشی (–) می توانند به عنوان پیشوند به عنوان ++x یا —x و همچنین پسوند به عنوان x++ یا x– استفاده شوند.
تنها تفاوت این دو فرم این است که اگر از آنها به عنوان پیشوند استفاده کنیم، عملگر قبل از اجرای عبارت اعمال می شود، اما اگر آنها را به عنوان پسوند استفاده کنیم، عملگر پس از اجرای عبارت اعمال می شود.
عملگرهای منطقی :
عملگرهای منطقی Kotlin برای تعیین منطق بین دو متغیر یا مقدار استفاده می شوند:
در زیر لیستی از عملگرهای منطقی Kotlin آمده است:
Operator | Name | Description | Example |
&& | Logical and | اگر هر دو عملوند درست باشند، true را برمی گرداند | x && y |
|| | Logical or | اگر هر یک از عملوندها درست باشد، true را برمی گرداند | x || y |
! | Logical not | نتیجه را معکوس کنید، اگر عملوند درست باشد، false را برمی گرداند | !x |
عملگرهای بیتی :
Kotlin هیچ عملگر بیتی ندارد اما لیستی از توابع کمکی برای انجام عملیات بیتی ارائه می دهد.
در زیر لیستی از توابع Bitwise زبان کاتلین آمده است:
Function | Description | Example |
shl (bits) | signed shift left | x.shl(y) |
shr (bits) | signed shift right | x.shr(y) |
ushr (bits) | unsigned shift right | x.ushr(y) |
and (bits) | bitwise and | x.and(y) |
or (bits) | bitwise or | x.or(y) |
xor (bits) | bitwise xor | x.xor(y) |
()inv | bitwise inverse | ()x.inv |
مثال :
fun main(args: Array) {
var x:Int = 60 // 60 = 0011 1100
var y:Int = 13 // 13 = 0000 1101
var z:Int
z = x.shl(2) // 240 = 1111 0000
println("x.shl(2) = " + z)
z = x.shr(2) // 15 = 0000 1111
println("x.shr(2) = " + z)
z = x.and(y) // 12 = 0000 1100
println("x.and(y) = " + z)
z = x.or(y) // 61 = 0011 1101
println("x.or(y) = " + z)
z = x.xor(y) // 49 = 0011 0001
println("x.xor(y) = " + z)
z = x.inv() // -61 = 1100 0011
println("x.inv() = " + z)
}
خروجی :
x.shl(2) = 240
x.shr(2) = 15
x.and(y) = 12
x.or(y) = 61
x.xor(y) = 49
x.inv() = -61
آرایه ها
آرایه ها برای ذخیره چندین آیتم از یک نوع داده در یک متغیر استفاده می شوند، مانند یک عدد صحیح یا رشته تحت نام یک متغیر واحد.
به عنوان مثال، اگر لازم باشد نام 1000 کارمند را ذخیره کنیم، به جای ایجاد 1000 متغیر رشته مختلف، می توانیم به سادگی یک آرایه از رشته تعریف کنیم که ظرفیت آن 1000 خواهد بود.
مانند هر زبان برنامه نویسی مدرن دیگری، کاتلین نیز از آرایه ها پشتیبانی می کند و طیف گسترده ای از ویژگی های آرایه و توابع پشتیبانی را برای دستکاری آرایه ها ارائه می دهد.
ایجاد آرایه در کاتلین :
برای ایجاد یک آرایه در Kotlin، از تابع ()arrayOf استفاده می کنیم و مقادیر را در یک لیست جدا شده با کاما در داخل آن قرار می دهیم:
val fruits = arrayOf("Apple", "Mango", "Banana", "Orange")
به صورت اختیاری می توانیم یک نوع داده را به صورت زیر ارائه کنیم:
val fruits = arrayOf("Apple", "Mango", "Banana", "Orange")
از طرف دیگر، تابع ()arrayOfNulls می تواند برای ایجاد آرایه ای با اندازه معین پر از المان های تهی استفاده شود.
آرایه های Primitive :
کاتلین همچنین دارای چند built-in factory برای ایجاد آرایه هایی از انواع داده های اولیه است.
به عنوان مثال، متد فکتوری برای ایجاد یک آرایه عدد صحیح :
val num = intArrayOf(1, 2, 3, 4)
سایر متد های کارخانه ای موجود برای ایجاد آرایه ها:
- ()byteArrayOf
- ()charArrayOf
- ()shortArrayOf
- ()longArrayOf
دریافت و تنظیم المان های یک آرایه :
ما می توانیم با استفاده از عدد شاخص داخل پرانتز به یک المان آرایه دسترسی پیدا کنیم.
شاخص آرایه کاتلین با صفر (0) شروع می شود.
بنابراین اگر میخواهید به عنصر چهارم آرایه دسترسی داشته باشید، باید عدد 3 را به عنوان شاخص وارد کنید.
fun main(args: Array) {
val fruits = arrayOf("Apple", "Mango", "Banana", "Orange")
println( fruits [0])
println( fruits [3])
}
خروجی :
Apple
Orange
Kotlin همچنین توابع عضو ()get و ()set را برای بدست آوردن و تنظیم مقدار در یک شاخص خاص ارائه می کند. مثال زیر را بررسی کنید:
fun main(args: Array) {
val fruits = arrayOf("Apple", "Mango", "Banana", "Orange")
println( fruits.get(0))
println( fruits.get(3))
// Set the value at 3rd index
fruits.set(3, "Guava")
println( fruits.get(3))
}
خروجی :
Apple
Orange
Guava
کاتلین ویژگی آرایه ای به نام size را ارائه می دهد که size یعنی طول آرایه را برمی گرداند.
fun main(args: Array) {
val fruits = arrayOf("Apple", "Mango", "Banana", "Orange")
println( "Size of fruits array " + fruits.size )
}
خروجی :
Size of fruits array 4
همچنین می توانیم از تابع عضو ()count برای بدست آوردن اندازه آرایه استفاده کنیم.
بررسی وجود عنصر :
میتوانیم از عملگر in به همراه if…else برای بررسی وجود عنصری در آرایه استفاده کنیم.
fun main(args: Array) {
val fruits = arrayOf("Apple", "Mango", "Banana", "Orange")
if ("Mango" in fruits){
println( "Mango exists in fruits" )
}else{
println( "Mango does not exist in fruits" )
}
}
خروجی :
Mango exists in fruits
مقادیر متمایز از Array :
Kotlin اجازه می دهد تا مقادیر تکراری را در یک آرایه ذخیره کنید، اما در عین حال می توانید مجموعه ای از مقادیر متمایز را با استفاده از تابع عضو ()distinct در آرایه ذخیره کنید.
fun main(args: Array) {
val fruits = arrayOf("Apple", "Mango", "Banana", "Orange", "Apple")
val distinct = fruits.distinct()
for( item in distinct ){
println( item )
}
}
خروجی :
Apple
Mango
Banana
Orange
حذف المان ها از آرایه :
ما می توانیم از توابع عضو ()drop یا ()dropLast برای رها کردن المان ها به ترتیب از ابتدا یا از آخرین استفاده کنیم.
مثال :
fun main(args: Array) {
val fruits = arrayOf("Apple", "Mango", "Banana", "Orange", "Apple")
val result = fruits.drop(2) // drops first two elements.
for( item in result ){
println( item )
}
}
خروجی :
Banana
Orange
Apple
بررسی یک آرایه خالی
ما می توانیم از تابع عضو ()isEmpty برای بررسی خالی بودن یا نبودن یک آرایه استفاده کنیم.
اگر آرایه خالی باشد این تابع true را برمی گرداند.
fun main(args: Array) {
val fruits = arrayOf()
println( "Array is empty : " + fruits.isEmpty())
}
خروجی :
“Array is empty : “true
Ranges
محدوده (range) کاتلین با دو مقدار نقطه پایانی آن تعریف می شود که هر دو در محدوده گنجانده شده اند.
محدوده های Kotlin با تابع ()rangeTo یا به سادگی با استفاده از عملگرهای downTo یا (. .) ایجاد می شوند.
عملیات اصلی بر روی محدوده ها contains است که معمولاً به صورت عملگرهای in و !in استفاده می شود.
مثال :
1..10 // Range of integers starting from 1 to 10
a..z // Range of characters starting from a to z
A..Z // Range of capital characters starting from A to Z
هر دو انتهای range همیشه در range گنجانده می شوند، به این معنی که عبارت 1..4 با مقادیر 1،2،3 و 4 مطابقت دارد.
()rangeTo
برای ایجاد یک رنج Kotlin، تابع () rangeTo را روی مقدار شروع محدوده فراخوانی می کنیم و مقدار پایان را به عنوان آرگومان ارائه می دهیم.
fun main(args: Array) {
for ( num in 1.rangeTo(4) ) {
println(num)
}
}
خروجی :
1
2
3
4
()downTo
اگر بخواهیم یک محدوده معکوس تعریف کنیم، می توانیم از عملگر downTo استفاده کنیم:
fun main(args: Array) {
for ( num in 4 downTo 1 ) {
println(num)
}
}
خروجی :
4
3
2
1
()step
ما می توانیم از تابع ()step برای تعریف فاصله بین مقادیر محدوده استفاده کنیم :
fun main(args: Array) {
for ( num in 1..10 step 2 ) {
println(num)
}
}
خروجی :
1
3
5
7
9
محدوده Characters
محدوده هایی را می توان برای کاراکترها ایجاد کرد، همانطور که ما آنها را برای مقادیر صحیح ایجاد کرده ایم.
fun main(args: Array) {
for ( ch in 'a'..'d' ) {
println(ch)
}
}
خروجی :
a
b
c
d
()reversed
تابع ()reversed می تواند برای معکوس کردن مقادیر یک محدوده استفاده شود.
fun main(args: Array) {
for ( num in (1..5).reversed() ) {
println(num)
}
}
خروجی :
5
4
3
2
1
()until
این تابع می تواند برای ایجاد یک محدوده استفاده شود، اما آخرین المان داده شده را حذف می کند.
fun main(args: Array) {
for ( num in 1 until 5 ) {
println(num)
}
}
خروجی :
1
2
3
4
Filtering Ranges
تابع ()filter لیستی از المان های منطبق با یک گزاره داده شده را برمی گرداند:
fun main(args: Array) {
val a = 1..10
val f = a.filter { T -> T % 2 == 0 }
println(f)
}
خروجی :
[2, 4, 6, 8, 10]
Distinct Values در Ranges
تابع ()distinct لیستی از مقادیر متمایز را از یک محدوده با مقادیر تکراری برمی گرداند:
fun main(args: Array) {
val a = listOf(1, 1, 2, 4, 4, 6, 10)
println(a.distinct())
}
خروجی :
[1, 2, 4, 6, 10]
توابع در کاتلین
کاتلین یک زبان تایپ ایستا است، از این رو توابع نقش زیادی در آن دارند.
ما کاملاً با تابع آشنا هستیم، زیرا از تابع در تمام آموزش های قبلی خود استفاده کرده ایم.
تابع یک بلوک از کد است که برای انجام یک کار خاص نوشته می شود.
توابع توسط تمام زبان های برنامه نویسی مدرن پشتیبانی می شوند و به عنوان متدها یا subroutines نیز شناخته می شوند.
در یک سطح وسیع، یک تابع مقداری ورودی می گیرد که parameters نامیده می شود، اقدامات خاصی را روی این ورودی ها انجام می دهد و در نهایت مقداری را برمی گرداند.
(ما در بخش های قبلی بسیاری از توابع را معرفی کردیم و در این بخش تنها توابع جدید را معرفی خواهیم کرد.)
Return Values
یک تابع kotlin بر اساس نیاز مقداری را برمیگرداند. بازگرداندن یک مقدار بسیار اختیاری است.
برای برگرداندن یک مقدار، از کلمه کلیدی Return استفاده کنید و نوع Return را بعد از پرانتزهای تابع مشخص کنید.
مثال :
fun main(args: Array) {
val a = 10
val b = 20
val result = sumTwo(a, b)
println( result )
}
fun sumTwo(a:Int, b:Int):Int{
val x = a + b
return x
}
خروجی :
30
Unit-returning
اگر تابعی مقدار مفیدی را برنگرداند، نوع بازگشتی آن Unit است.
fun sumTwo(a:Int, b:Int):Unit{
val x = a + b
println( x )
}
توابع Recursive
توابع بازگشتی در بسیاری از صحنه ها مانند محاسبه فاکتوریل یک عدد یا تولید سری فیبوناچی مفید هستند. Kotlin
از بازگشت آنها پشتیبانی می کند، به این معنی که یک تابع Kotlin می تواند خود را فراخوانی کند.
fun main(args: Array) {
val a = 4
val result = factorial(a)
println( result )
}
fun factorial(a:Int):Int{
val result:Int
if( a <= 1){
result = a
}else{
result = a*factorial(a-1)
}
return result
}
خروجی :
24
tail recursion
یک تابع بازگشتی برای tail recursion واجد شرایط است اگر فراخوانی تابع به خود آخرین عملیاتی باشد که انجام می دهد.
مثال :
در زیر یک برنامه کاتلین برای محاسبه فاکتوریل عدد 10 با استفاده از tail recursion آورده شده است. در اینجا باید اطمینان حاصل کنیم که ضرب قبل از فراخوانی بازگشتی انجام می شود نه بعد از آن.
fun main(args: Array) {
val a = 4
val result = factorial(a)
println( result )
}
fun factorial(a: Int, accum: Int = 1): Int {
val result = a * accum
return if (a <= 1) {
result
} else {
factorial(a - 1, result)
}
}
خروجی :
24
توابع مرتبه بالا
تابع مرتبه بالاتر تابعی است که تابع دیگری را به عنوان پارامتر می گیرد ویا تابعی را برمی گرداند.
در زیر تابعی وجود دارد که دو پارامتر عدد صحیح a و b را می گیرد و علاوه بر این، operation تابع دیگری را به عنوان پارامتر می گیرد:
fun main(args: Array) {
val result = calculate(4, 5, ::sum)
println( result )
}
fun sum(a: Int, b: Int) = a + b
fun calculate(a: Int, b: Int, operation:(Int, Int) -> Int): Int {
return operation(a, b)
}
خروجی :
9
در اینجا ما higher-order function (تابع مرتبه بالاتر) را که در دو مقدار صحیح ارسال می شود و آرگومان تابع ::sum فراخوانی می کنیم.
اینجا :: نمادی است که یک تابع را با نام در Kotlin ارجاع می دهد.
بیایید به مثال دیگری نگاه کنیم که در آن یک تابع تابع دیگری را برمی گرداند.
در اینجا یک تابع مرتبه بالاتر تعریف کردیم که یک تابع را برمی گرداند.
Int <- (Int) پارامترها و نوع بازگشتی تابع مربع را نشان می دهد.
fun main(args: Array) {
val func = operation()
println( func(4) )
}
fun square(x: Int) = x * x
fun operation(): (Int) -> Int {
return ::square
}
خروجی :
9
تابع Lambda
Kotlin lambda تابعی است که نامی ندارد و با پرانتزهای {} تعریف شده است که صفر یا بیشتر پارامتر و body تابع را می گیرد.
body تابع بعد از متغیر (در صورت وجود) و سپس عملگر -> نوشته می شود.
fun main(args: Array) {
val upperCase = { str: String -> str.toUpperCase() }
println( upperCase("hello, world!") )
}
خروجی :
HELLO, WORLD!
توابع درون خطی
یک تابع درون خطی با کلمه کلیدی inline اعلام می شود.
استفاده از تابع inline عملکرد توابع مرتبه بالاتر را افزایش می دهد.
تابع inline به کامپایلر می گوید که پارامترها و توابع را در سایت فراخوانی کپی کند.
fun main(args: Array) {
myFunction({println("Inline function parameter")})
}
inline fun myFunction(function:()-> Unit){
println("I am inline function - A")
function()
println("I am inline function - B")
}
خروجی :
I am inline function – A
Inline function parameter
I am inline function – B
مهرسا امینی
برنامه نویس ، انیماتور ، سئوکار
در زندگی رویاهات را دنبال کن