Örnekle Alıcı ile Kotlin Fonksiyon Değişmezini Anlayın

Bu lambda sözdizimine rastladım – NavGraphBuilder.() -> Unit
ve denildiği ortaya çıktı Alıcı ile Fonksiyon Değişmeziolarak da bilinen Alıcı ile Lambda/Anonim İşlev.
Sözdizimi şöyle görünür:
Alıcı.(Parametreler) → ReturnType
Aşağıda, alıcı ile işlev değişmezini kullanarak özel bir dize oluşturmaya ilişkin bazı örnekler gösterilmektedir.
Örnek 1: Alıcı ile Fonksiyon Değişmezi
fun buildCustomStringExample1(
action: StringBuilder.(String) -> Unit): String {
val stringBuilder = StringBuilder()
stringBuilder.action("Example1")
return stringBuilder.toString()
}
action
alıcı ile değişmez / lambda işlevi işlevidir. StringBuilder
alıcıdır. gibi davranır uzatma işlevi nın-nin StringBuilder
hangi alır string
giriş parametresi olarak
Aramak action
, StringBuilder
somutlaştırılırsa, onu bir uzantı işlevi gibi çağırın – stringBuilder.action("Example1")
Hayal edebilirsin
action
ait olan bir geri arama işlevi gibidirStringBuilder
.
kullanım
Bu, işlev değişmezinin alıcı ile kullanımıdır:
val output1 = buildCustomStringExample1 { content ->
this.append("<tag>")
append("$content")
append("</tag>")
}
println("$output1")
diyoruz buildCustomStringExample1
fonksiyon değişmezi / lambda fonksiyon parametresi ile. Bu lambda işlevinde, özel dizeyi nasıl oluşturacağımızı belirtiyoruz – içeriği şununla sarın: "<tag>"
ve "</tag>"
.
content
gelen girdi parametresidir buildCustomStringExample1
işlev. this
bu StringBuilder
içinde oluşturulan örnek buildCustomStringExample1()
işlev görebilir ve atlanabilir. append()
ait olduğu fonksiyondur StringBuilder
.
[Updated – Jun 12, 22]: Yakın zamanda bu tür kullanıma etki alanı tarafından belirlenmiş dil (DSL) olarak adlandırıldığını öğrendim. Bu nedenle, DSP’yi oluşturmak için alıcı ile işlev değişmezi kullanılır. Temel amaç okunabilirlik içindir.
Çıktı
Çıktı şöyle görünür:
<tag>Example1</tag>
Örnek 2: Alıcısız Fonksiyon Değişmezi
İşlev değişmezi / alıcılı lambda işlevi, aşağıdaki sözdizimine dayalı olarak alıcı kullanılmadan yeniden yazılabilir:
(Alıcı, Parametreler) → ReturnType
bu her zamanki lambda ifadeleri hangi 2 parametre alır. İlk parametre, StringBuilder
bu, yukarıdaki örnek 1’deki alıcıdır.
fun buildCustomStringExample2(
action: (StringBuilder, String) -> Unit
): String {
val stringBuilder = StringBuilder()
action(stringBuilder, "Example2")
return stringBuilder.toString()
}
action
2 parametre alan olağan geri arama işlevidir. Aramak action
, StringBuilder
somutlaştırılır ve ilk parametre olarak iletilir. action
geri arama işlevi – action(stringBuilder, "Example2")
kullanım
Bu, işlev değişmezinin alıcı olmadan kullanımıdır:
val output2 = buildCustomStringExample2 { stringBuilder, content ->
stringBuilder.append("<tag>")
stringBuilder.append("$content")
stringBuilder.append("</tag>")
}
println("$output2")
Bu, artık kullanmamamız dışında örnek 1’e benzer. this
hangi tarafından değiştirildi stringBuilder
ilk lambda parametresi olarak. content
lambda fonksiyonunun ikinci parametresidir.
Çıktı
Çıktı, örnek 1 ile aynı çıktıya sahip olan şuna benzer:
<tag>Example2</tag>
Çözüm
Alıcı ile gerçek işlevi anlamak zor değil. Temel olarak, normal fonksiyon değişmez / lambda fonksiyonunu ek parametre olmadan yazmanın basitleştirilmiş bir yoludur.
Alıcı ile Fonksiyon Değişmezi olarak yeniden yazılabilir Alıcısız Fonksiyon Değişmezi.
Receiver.(Parameters) → ReturnType
—> (Receiver, Parameters) → ReturnType