Scope Functions

Sümeyra Özuğur🍂
3 min readFeb 21, 2023

Kotlin dilinin bu kadar popüler olmasının nedenlerinden biri az kodla çok iş halletmesi. Aslında bakarsanız scope fonksiyonlar da bu amaca hizmet ediyor.

🌈Scope Fonksiyonlar Nedir?

  • Kod bloğu kapsamında kod tekrarını engeller ve daha sade ve okunaklı olmasını sağlar.
  • ️Scope fonksiyonlar herhangi bir yeni teknoloji özelliği katmaz.

5 adet scope fonksiyonumuz var. Bunlar; with, let, run, apply, also şeklindedir.

👉🏻let, run, also ve apply extension fonksiyondur.

👉🏻let, also -> it reference olur ve yeniden adlandırılır;

👉🏻run, with, apply -> this ‘e referans olur ve yeniden adlandırılmazlar.

👀Scope Fonksiyonları oldukça birbirlerine benzer. Onları ayırmanın
2 Farklı yolu var. Bunlar ise:
- Referans verdikleri contex nesnesi(this or it)
- Döndürdüğü değer

📌With Fonksiyonu

  • contex object -> this
  • return değeri -> lambda

Aşağıdaki örnektede gördüğünüz gibi, with(numbers) diyerekten mutableListOf(“one”, “two”, “three”)’a ulaşıyoruz. Bu kapsam boyunca istersek listenin kendisine yada listenin özelliklerine numbers yazmadan ulaşıyoruz.

    val numbers = mutableListOf("one", "two", "three")
with(numbers) {
println("'with' is called with argument $this")
println("It contains $size elements")
}


//Output
'with' is called with argument [one, two, three]
It contains 3 elements

with(binding){} ile kullanılması sıklıkla görebilirsiniz. Böylece her seferinde view’e ulaşmak için binding tekrarından kurtulmuş olursunuz.

📌Let Fonksiyonu

  • contex object -> it (istediğiniz isimle adlandırılabilir)
  • return değeri -> lambda

Genelde null check için kullanılır. Bu yüzden sıklıkla bu şekilde ?.let{} görürsünüz. Değer null değilse bu blok çalışır. Böylece Null Pointer Exception hatalarından bizi korumuş olur.

   private var number:Int ?= null

val x = number?.let { writeSomething->
val number2 = writeSomething+1
}

Bu kısımda x in değerine baktığımızda x in Unit döndüğünü görürüz.

Eğer son ifadesi atamasız bir ifade olursada, x in değeri onun dönüş değeri olur. Aşağıdaki kod bloğunda x in dönüş değeri integer dır.

val x = number?.let {
val number2 = it +1
number2
}

Daha öncede söylediğim gibi, number null değilse bu kod bloğu çalışıyor. Ya null ise, ?: ile kontrol ediyoruz.

⭐️Number null değilse kod bloğunu çalıştır, null ise de 3 döndür demiş olduk.

  val x = number?.let {
val number2 = it +1
number2
}?:3

📌Run Fonksiyonu

  • contex object -> this
  • return değeri -> lambda

Run fonksiyonu, let fonksiyonuna çok benziyor. Null kontrolü yapabiliyoruz, hatta eğer son ifadesi atamasız bir ifade olursa da, x in değeri onun dönüş değeri oluyor.

Peki aralarındaki fark nedir?

  • Run, this parametresini , let ise it parametresini alır.
  val x = number?.run {
val number2 = this +1
number2
}

📌Apply Fonksiyonu

  • contex object -> this
  • return değeri -> contex

Apply fonksiyonunu hedef objenin üyeleri için değer ataması yapar.

class  Person{
var age:Int =0
var city:String =""
}

böyle bir sınıftan normalde obje oluşturmak için

val adm =Person()
adm.age =32
adm.city = "London"

Bunu apply fonksiyonu ile ;

  val person = Person().apply {
age = 32
city = "London"
}

📌Also Fonksiyonu

  • contex object -> it (istediğiniz isimle adlandırılabilir)
  • return değeri -> contex

Apply fonksiyonuna benzer.

 val numbers = mutableListOf("one", "two", "three")
numbers.also {
println("The list elements before adding new one: $it")
it.add("6")}
println(numbers)
//Output
[one, two, three, 6]

--

--