Challenge - 5 Problems
Kotlin DSL Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate2:00remaining
What is the output of this Kotlin DSL configuration?
Consider this Kotlin DSL code that configures a server. What will be printed when running the main function?
Kotlin
class ServerConfig { var host: String = "localhost" var port: Int = 80 fun printConfig() { println("Server running on $host:$port") } } fun server(block: ServerConfig.() -> Unit): ServerConfig { val config = ServerConfig() config.block() return config } fun main() { val config = server { host = "192.168.1.1" port = 8080 } config.printConfig() }
Attempts:
2 left
💡 Hint
Look at how the DSL block changes the properties inside ServerConfig.
✗ Incorrect
The DSL block sets host to "192.168.1.1" and port to 8080, so the printed output reflects these values.
🧠 Conceptual
intermediate1:30remaining
Which Kotlin feature enables the Configuration DSL pattern?
Which Kotlin language feature is primarily used to create a Configuration DSL pattern like the example below?
```kotlin
fun server(block: ServerConfig.() -> Unit): ServerConfig {
val config = ServerConfig()
config.block()
return config
}
```
Attempts:
2 left
💡 Hint
Think about how the lambda can access ServerConfig's members directly inside the block.
✗ Incorrect
Extension functions with lambda receiver allow the lambda to operate as if it is inside the ServerConfig class, enabling the DSL style.
🔧 Debug
advanced2:30remaining
Why does this Kotlin DSL configuration fail to set the port?
Given this code, why does the port remain 80 instead of changing to 9090?
```kotlin
class ServerConfig {
var host: String = "localhost"
var port: Int = 80
}
fun server(block: ServerConfig.() -> Unit): ServerConfig {
val config = ServerConfig()
block()
return config
}
fun main() {
val config = server {
host = "example.com"
port = 9090
}
println("${config.host}:${config.port}")
}
```
Attempts:
2 left
💡 Hint
Check how the block lambda is called inside the server function.
✗ Incorrect
The block lambda is called without a receiver, so it does not modify the config instance. It should be called as config.block() to apply changes.
📝 Syntax
advanced1:30remaining
Which option correctly defines a Kotlin DSL function with a lambda receiver?
Select the correct Kotlin function signature for a DSL function that takes a lambda with receiver of type Config and returns Config.
Attempts:
2 left
💡 Hint
Look for the syntax that declares a lambda with receiver.
✗ Incorrect
The syntax Config.() -> Unit means the lambda has Config as receiver, enabling DSL style access.
🚀 Application
expert3:00remaining
How many items are in the resulting map after this Kotlin DSL runs?
Consider this Kotlin code using a DSL to build a map:
```kotlin
class MapBuilder {
private val map = mutableMapOf()
fun entry(key: String, value: Int) {
map[key] = value
}
fun build(): Map = map
}
fun map(block: MapBuilder.() -> Unit): Map {
val builder = MapBuilder()
builder.block()
return builder.build()
}
fun main() {
val result = map {
entry("a", 1)
entry("b", 2)
entry("a", 3)
}
println(result.size)
}
```
Attempts:
2 left
💡 Hint
Think about what happens when the same key is added twice in a map.
✗ Incorrect
The key "a" is added twice; the second value overwrites the first, so the map has keys "a" and "b", total 2 entries.