【问题标题】:way of using elements in list of kotlin?在 kotlin 列表中使用元素的方式?
【发布时间】: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 我添加示例输入和输出

标签: list kotlin


【解决方案1】:

您必须以某种方式组合列表项的 toDef 结果的值,但组合它们的方式取决于您。

例如,您可以这样使用joinToString

class S_Group(val obj: List<S>) : S(0, 0, 200, 200) { 
    override fun toDef() = obj.joinToString { it.toDef() }
}

默认情况下,像这样调用的joinToString将通过连接每个元素的toDef()的所有结果来创建一个字符串,并在每个元素之间插入, 。您可以使用joinToString的更多参数进一步自定义分隔符、前缀和后缀。

编辑:我刚刚意识到您正在生成 HTML 标记,因此您可能希望将分隔符设置为 "" 而不是默认的 ", "

【讨论】:

  • 我不知道为什么我找不到那个。谢谢。
  • 因为列表项的toDef结果格式为,我可以使用默认分隔符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 2020-04-11
  • 2020-01-31
相关资源
最近更新 更多