Josh Skeen, David Greenhalgh著『Kotlinプログラミング』には章末問題がある。残念なことに解答がないので、第15章に引き続き本を読み進めながら答案を記述する。
もし回答に間違いや意見があれば、ぜひご指摘いただきたい。
第18章 章末問題 回答案
18.11 チャレンジ! toDragonSpeackエクステンション
toDragonSpeak()関数をコメントアウトし、新たにString関数に対してtoDragonSpeakの拡張関数を作る。この時phraseをthisに置き換る。
Tavern.kt
//private fun toDragonSpeak(phrase: String) = phrase.replace(Regex("[aeiouAEIOU]")) {
// when (it.value) {
// "a", "A" -> "4"
// "e", "E" -> "3"
// "i", "I" -> "2"
// "o", "O" -> "1"
// "u", "U" -> "|_|"
// else -> it.value
// }
//}
private fun String.toDragonSpeak() = this.replace(Regex("[aeiouAEIOU]")) {
when (it.value) {
"a", "A" -> "4"
"e", "E" -> "3"
"i", "I" -> "2"
"o", "O" -> "1"
"u", "U" -> "|_|"
else -> it.value
}
}
また使い方は、次のとおり。
Tavern.kt
private fun placeOrder(patronName: String, menuData: String) {
//省略
// 所持金が代金を上回っているとき
val phrase = if (name == "Dragon's Breath") {
"Madrigal exclaims " + "Ah, delicious $name!".toDragonSpeak() // <==使用箇所
// "Madrigal exclaims ${toDragonSpeak("Ah, delicious $name!")}" // 元の記述
} else {
"Madrigal says: Thanks for the: $name."
}
//省略
18.11 チャレンジ! 額縁エクステンション
frame_extention.kt
fun main() {
// print(frame("Welcome, Madrigal", 5 ))
print("Welcome, Madrigal" .frame(5,"+"))
print("Hello, Morgal!" .frame(5))
}
fun String.frame(padding: Int, formatChar: String = "*") = {
val greeting = this
val middle = formatChar.padEnd(padding)
.plus(greeting)
.plus(formatChar.padStart(padding))
val end = (0 until middle.length).joinToString("") { formatChar }
"$end\r\n$middle\r\n$end\r\n"
}()
//
//fun frame(name: String, padding: Int, formatChar: String = "*"): String {
// val greeting = "$name"
// val middle = formatChar.padEnd(padding)
// .plus(greeting)
// .plus(formatChar.padStart(padding))
// val end = (0 until middle.length).joinToString(""){formatChar} // <==誤記? formatCharを{}で囲む
// return "$end\r\n$middle\r\n$end"
//}
第2章チャレンジ!答案
第3章チャレンジ!答案
第4章チャレンジ!答案
第7章チャレンジ!答案
第8章チャレンジ!答案
第10章チャレンジ!答案
第13章チャレンジ!答案
第15章チャレンジ!答案
第18章チャレンジ!答案
第19章チャレンジ!答案