質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1466閲覧

unaryPlus() の実装

Liao

総合スコア9

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/04/28 19:07

編集2020/04/30 00:10

###実現したいこと:
"+" のマークを使用して、td { } 内に文字列を挿入したい。

###わからないこと:
unaryPlus() の{ }内にどのようなことを書けば、"+" が使えるようになるのかわかりません。

###問題のソースコード:

Kotlin

1open class Tag(val name: String) { 2 private val children = mutableListOf<Tag>() 3 4 protected fun <T : Tag> doInit(child: T, init: T.() -> Unit) { 5 child.init() 6 children.add(child) 7 } 8 9 override fun toString() = 10 "<$name>${children.joinToString("")}</$name>" 11} 12 13fun table(init: TABLE.() -> Unit) = TABLE().apply(init) 14 15class TABLE : Tag("table") { 16 fun tr(init: TR.() -> Unit) = doInit(TR(), init) 17} 18class TR : Tag("tr") { 19 fun td(init: TD.() -> Unit) = doInit(TD(), init) 20} 21class TD : Tag("td") 22 23fun createTable() = 24 table { 25 tr { 26 td {+"Hello" 27 } 28 } 29 } 30 31private operator fun String.unaryPlus() { 32 TODO("Not yet implemented") 33} 34 35fun main() { 36 println(createTable()) 37}

というコードが、ソースコードの全文となっています。
その中の

private operator fun String.unaryPlus() { TODO("Not yet implemented") }

というコードにおける

TODO("Not yet implemented")

という部分に何を書けばよいのかわからず、悩んでいます。
これが実装できれば、td 内に Hello が表示されるはずだと考えています。

###試したこと
children や append 、 (this + " ")のようなものを使うと予想しています。ただ、自信はありません。
kotlin in action という本のp294 及び
https://github.com/Kotlin/kotlin-by-example/blob/master/examples/09_Kotlin_JS/06_HtmlBuilder.md
上記のサイトを参考にしています。

###補足
Kotlin version: 1.3.72
Android Studio を使用しています。

###自己解決時に参考にしたコード

Kotlin

1interface Element { 2 fun render(builder: StringBuilder, indent: String) 3} 4 5class TextElement(private val text: String) : Element { 6 override fun render(builder: StringBuilder, indent: String) { 7 builder.append("$indent$text\n") 8 } 9} 10 11@DslMarker 12annotation class HtmlTagMarker 13 14@HtmlTagMarker 15abstract class Tag(val name: String) : Element { 16 val children = arrayListOf<Element>() 17 val attributes = hashMapOf<String, String>() 18 19 protected fun <T : Element> initTag(tag: T, init: T.() -> Unit): T { 20 tag.init() 21 children.add(tag) 22 return tag 23 } 24 override fun render(builder: StringBuilder, indent: String) { 25 builder.append("$indent<$name${renderAttributes()}>\n") 26 for (c in children) { 27 c.render(builder, "$indent ") 28 } 29 builder.append("$indent</$name>\n") 30 } 31 32 private fun renderAttributes(): String { 33 val builder = StringBuilder() 34 for ((attr, value) in attributes) { 35 builder.append(" $attr=\"$value\"") 36 } 37 return builder.toString() 38 } 39 override fun toString(): String { 40 val builder = StringBuilder() 41 render(builder, "") 42 return builder.toString() 43 } 44} 45abstract class TagWithText(name: String) : Tag(name) { 46 operator fun String.unaryPlus() { 47 children.add(TextElement(this)) 48 } 49} 50 51class HTML : TagWithText("html") { 52 fun head(init: Head.() -> Unit) = initTag(Head(), init) 53 54 fun body(init: Body.() -> Unit) = initTag(Body(), init) 55} 56 57class Head : TagWithText("head") { 58 fun title(init: Title.() -> Unit) = initTag(Title(), init) 59} 60 61class Title : TagWithText("title") 62 63abstract class BodyTag(name: String) : TagWithText(name) { 64 fun b(init: B.() -> Unit) = initTag(B(), init) 65 fun p(init: P.() -> Unit) = initTag(P(), init) 66 fun h1(init: H1.() -> Unit) = initTag(H1(), init) 67 fun a(href: String, init: A.() -> Unit) { 68 val a = initTag(A(), init) 69 a.href = href 70 } 71} 72class Body : BodyTag("body") 73class B : BodyTag("b") 74class P : BodyTag("p") 75class H1 : BodyTag("h1") 76 77class A : BodyTag("a") { 78 var href: String 79 get() = attributes["href"]!! 80 set(value) { 81 attributes["href"] = value 82 } 83} 84 85fun html(init: HTML.() -> Unit): HTML { 86 val html = HTML() 87 html.init() 88 return html 89}

このコードの

abstract class TagWithText(name: String) : Tag(name) { operator fun String.unaryPlus() { children.add(TextElement(this)) } }

という部分を参考にいたしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakasho_dev

2020/04/29 13:48

もし学校の課題等でしたら学校で聞くのが一番だと思います。 また『試したこと』で「予想しています」とありますが、まずはご自身で試してそれでもダメでしたら、どのようにダメだったかを書いた方が良いと思います。試すことでどこまで理解されてどこからが分からないのかが明確になっていくと思います。質問するときのヒント(https://teratail.com/help/question-tips)も良く読んで必要に応じて質問を編集しましょう。
Liao

2020/04/29 15:05 編集

ご指摘ありがとうございます! 確かに仰る通りで、単なる自分の甘えでした。 自分は Kotlin を趣味で学んでいる身なので、甘えを許さず自分の力で乗り越えていこうと思います。
nakasho_dev

2020/04/29 15:28

返信ありがとうございます。自己解決したようで何よりです。自己解決したのであれば解決したコードを書くべきだと思います。 このサイトはナレッジマネジメントのサイトなので聞くこと自体は良いと思います。ですが最低限、ご自身で試みる姿勢がないとteratailの「思考するエンジニア特化型Q&Aサイト」の趣旨と変わってきてしまう印象です。 また、どのような振る舞いのプログラムを実現したいという内容ではなく穴埋め問題のような内容だったので学校の課題かと勘違いしてしまいました。
Liao

2020/04/30 00:17

こちらこそ返信ありがとうございます。 今回の件について非常に反省しております。今後このようなことがないよう気をつけます。 回答者様のおかげで、プログラミングに対する考え方を改める良い機会となりました。 繰り返しになりますが、ありがとうございました。
guest

回答1

0

自己解決

github に似たようなソースコードを見つけたので、自力で解決いたしました。

投稿2020/04/29 15:07

Liao

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問