Puzzlers on Kotlin Academy, week 2
Originally published at blog.kotlin-academy.com
Time for new battery of Kotlin puzzlers. In this week we’ve concentrated more on teaching and showing surprising facts about Kotlin. Have fun
Lambda runnables
fun run() {
val run: () -> Unit = {
println("Run run run!")
}
object : Runnable {
override fun run() = run()
}.run()
}
run()
Author: Redrield
What will it display? Some possibilities:
a) “Run run run!”
b) Doesn’t compile
c) StackOverflowError
d) None of the above
Check out answer and explanation using this link or by reading this article till the end.
Making open abstract
open class A {
open fun a() {}
}
abstract class B: A() {
abstract override fun a()
}
open class C: B()
a) Compiles fine
b) Error: Class ‘C’ is not abstract and does not implement abstract base class member
c) Error: ‘a’ overrides nothing
d) Error: Function ‘a’ must have a body
Author: Marcin Moskala
This fact is not well known, but it might help you one day
Check out answer and explanation using this link or by reading this article till the end.
List minus list
val list = listOf(1, 2, 3)
print(list - 1)
print(list - listOf(1))
val ones = listOf(1, 1, 1)
print(ones - 1)
print(ones - listOf(1))
What does it display? Some possibilities:
a) [2, 3][2, 3][1, 1][1, 1]
b) [2, 3][2, 3][1, 1][]
c) [1, 3][2, 3][][1, 1]
d) [2, 3][2, 3][][]
Author: Marcin Moskala
Another peace of surprising knowledge that can save you one day from hours of searching for error
Check out answer and explanation using this link or by reading this article till the end.
Answers and explanations
For “Lambda runnables” correct answer is:
a) “Run run run!”
Why? Here is an explanation:
In object expression, Kotlin prefers to use
run
defined as a local variable. Be careful! This won’t work well:
val run: () -> Unit = {
println("Run run run!")
}
fun run() {
object : Runnable {
override fun run() = run()
}.run()
}
Nor this:
fun run() {
val run: () -> Unit = {
println(“Run run run!”)
}
object : Runnable {
override fun run() = this.run()
}.run()
}
For “Making open abstract” correct answer is:
b) Error: Class ‘C’ is not abstract and does not implement abstract base class member
Why? Here is an explanation:
We can override an open function with abstract one, but then it is abstract and we need to override it in all subclasses. This works fine:
open class A {
open fun a() {}
}
abstract class B: A() {
abstract override fun a()
}
open class C: B() {
override fun a() {}
}
C().a()
For “List minus list” correct answer is:
b) [2, 3][2, 3][1, 1][]
Why? Here is an explanation:
List<T> minus T removes the first element that equals. List<T> minus List<T> filters out all elements that equal to any element on the second list.
Do you have your own idea for a puzzler? Submit it on Kotlin Academy portal.
Do you want more puzzlers in the future? Track Kotlin Academy portal or subscribe to our mailing list.
To be up-to-date with great news on Kotlin Academy, subscribe to the newsletter, observe Twitter and follow.
If you like it, remember to clap. Note that if you hold the clap button, you can leave more claps.