【发布时间】:2021-11-11 00:18:35
【问题描述】:
我编写了一个代码来使用 HTML 标签
绘制矢量图形图像但我在编写通过列表一次接收多个形状的代码时遇到了困难。
abstract class S(val x: Int, val y: Int, val w: Int, val h: Int,
val style: String = "background-color:lightgray") : Renderable {
abstract fun toDef(): String
override fun render(notebook: Notebook) = HTML("""
<svg width="${w}" height="${h}" style="${style}">
${toDef()}
</svg>
""")
}
// Rectangle
class R(x: Int, y: Int, val width: Int, val height: Int, val fill: String
) : S(x, y, x+width, y+height) {
override fun toDef() : String =
"""<rect x=${x} y=${y} width=${width} height=${height} fill=${fill} style="opacity: 0.5"/>"""
}
// Circle
class C(val cx: Int, val cy: Int, val r: Int, val fill: String
) : S(cx-r, cy-r, cx+r, cy+r) {
override fun toDef() : String =
"""<circle cx=${cx} cy=${cy} r=${r} fill=${fill} style="opacity:0.5"/>"""
}
S 是一个抽象类,基本上有关于形状所占据的矩形区域的信息。
R和C是分别对应SVG的矩形和圆形标签的类。
下面的代码是允许接收一个列表(各种R和C)并通过toDef()方法将它们表达在一个矩形区域中的代码。
class S_Group(val obj: List<S>
) : S(0, 0, 200, 200) {
override fun toDef() = "" // what should i use?
}
一开始我以为可以用for循环和list的get()方法,但后来发现toDef()是一个字符串动作,所以不能这样做。
接下来,我想知道我是否可以像下面这样使用Lamda Expression,但它不起作用。
"${o(::toDef())}"
获取错误消息:
此语法保留用于 未来使用;要调用引用,请将其括在括号中: (foo::bar)(args)
我想不出其他的想法,所以参考了stackoverflow的几个问题并阅读了Kotlin Docs,但我仍然不知道。
S_Group 的 toDef() 方法有什么填充方法吗?
输入输出考试:
输入:
val R1 = R(10,20,80,100,"绿色")
val C1 = C(0,30,30,"红色")S_Group(listOf(R1, C1))
输出我想要的:
当前输出:
【问题讨论】:
-
你能在这里提供一个示例输入和输出吗?
-
@ArpitShukia 我添加示例输入和输出