0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Josh Skeen, David Greenhalgh著 『Kotlinプログラミング』 章末問題に挑戦(第18章)

Last updated at Posted at 2020-12-27

 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章チャレンジ!答案

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?