You will remember from Chapter 4, Functions in Kotlin, that the receiver of a function is the instance that corresponds to the this keyword when inside the function body. In Kotlin, function parameters can be defined to accept a receiver when they are invoked. We do that using the following syntax:
fun foo(fn: String.() -> Boolean): Unit
Then, when we invoke the fn function in the foo function body, we are required to invoke it on an instance of a string, as you can see if we complete the implementation of foo:
fun foo(fn: String.() -> Boolean): Unit { "string".fn() }
This feature also works with anonymous functions:
val substring = fun String.(substr: String): Boolean = this.contains(substr) "hello".substring("ello")
You might prefer the anonymous function syntax if you wish to...