Scope fonksiyonlar, kod karmaşasını önlemek ve kodu sadeleştirmek adına tasarlanmış fonksiyonlardır.
Android uygulama geliştirirken Kotlin’le geliştirmenin Java’ya göre scope fonskiyonlar yönünden fazlasıyla kolaylığı vardır.
Bir objeyi scope fonksiyonları kullanarak çağırdığınızda, geçerli obje için geçici bir scope (alan – kurtarılmış bölge) oluşturulur. Bu scope içerisinde, objenin ismi olmadan, objenin attribute’larına veya metodlarına yani üyelerine erişilebilir. Kotlin’de 5 adet scope fonksiyon mevcuttur.
- apply
- let
- run
- also
- with
apply
Apply, değer dönmeyen, öncelikli hedefi objenin üyeleri için atama işlemi yapan kod blokları için kullanılır. Apply için yaygın senaryo, obje konfigürasyon işlemleridir.
textViewAccountTitle.visibility = View.VISIBLE textViewAccountTitle.text = "Account Title" textViewAccountTitle.isAllCaps = false textViewAccountTitle.textSize = 25f
apply fonksiyonu kullanarak da aynı işlemler gerçekleştirilebilir.
textViewAccountTitle.apply {
visibility = View.VISIBLE
text = "Account Title"
isAllCaps = false
textSize = 25f
}
let
Let, non-null değerleri çalıştırmak için kullanılır. Null olmayan bir nesnede işlemleri gerçekleştirmek için, ?. (nullable kontrolü) operatörünü kullanılır ve let’in içinde “it” ile aksiyonları çağırılır.
val cardNumber: String? = "12345" fun printCard() { cardNumber?.let { print("The length of the card number is ${it.length}") } }
run
Run’ın 2 kullanım şekli vardır. 1. kullanım şekli aşağıdadır.
val service = MultiportService("https://example.kotlinlang.org", 80)
val result = service.run {
port = 8080
query(prepareRequest() + " to port $port")
}
val letResult = service.let {
it.port = 8080
it.query(it.prepareRequest() + " to port ${it.port}")
}
printCard()
run(), bu kullanımında let() ile aynı şeyi yapar. Farklı oldukları kısım aldıkları parametredir. run, this parametresini; let ise it parametresini alır. run(), lambda ifadeniz hem obje yaratmayı hem de return edilecek değerin hesaplanması gerektiğinde kullanılabilir.
2. kullanım şekli ise aşağıdaki gibidir.
val hexNumberRegex = run {
val digits = "0-9"
val hexDigits = "A-Fa-f"
val sign = "+-"
Regex("[$sign]?[$digits$hexDigits]+")
}
for (match in hexNumberRegex.findAll("+1234 -FFFF not-a-number")) {
println(match.value)
}
run scope fonksiyonun 2. kullanımı da yukarıda ki gibi non-extension fonksiyon kullanımıdır. non-extension olan run, farklı kod satırlarının bir arada çalıştırılması gerektiğinde kullanılabilir.
also
Also, objeyi değişime uğratmayan, loglama, debug bilgilerini print etme gibi ek aksiyonlar için kullanılabilir.
cardDrawer.apply { visibility = View.VISIBLE setBehaviour(CardDrawerView.Behaviour.RESPONSIVE) show(config) setInternalPadding(0) setArrowEnabled(miniCard.showChevron) }.also { Log.d("TAG", "Card drawer initialized with $it.behaviour") }
Also çağrıları; “Ve ayrıca aşağıdakileri yap.” şeklinde okunabilir.
with
With çağrıları; “Bu object ile, aşağıdakileri gerçekleştir.” şeklinde okunabilir.
With lambda sonucu sağlamaksızın, ilgili objeler üzerinde fonksiyonları çağırmak için kullanılabilir.
val numbers = mutableListOf("one", "two", "three")
with(numbers) {
println("'with' is called with argument $this")
println("It contains $size elements")
}
With için diğer bir durum, bir özelliği olan properties veya bir değeri hesaplamak için kullanılan bir fonksiyon olan yardımcı bir obje tanımlamaktır.
val numbers = mutableListOf("one", "two", "three")
val firstAndLast = with(numbers) {
"The first element is ${first()}," +
" the last element is ${last()}"
}
println(firstAndLast)
Kaynakça;
https://kotlinlang.org/docs/reference/scope-functions.html
https://proandroiddev.com/kotlin-scope-functions-made-simple-c59b97a04ca2