如何编写一个有趣的扩展名以在Kotlin中附加字符串?

时间:2018-07-26 08:00:12

标签: android kotlin

我正在编写有关扩展乐趣的练习代码。

我计划为String添加扩展乐趣myAdd,该扩展接受lambda乐趣并将lambda的结果附加到String。

例如:

var cc="abc".myAdd{"de"}  //I hope to get "abcde", I don't know whether the lambda {"de"} is correct.

但是代码A是错误的,我该如何解决?

代码A

fun String.myAdd(predicate: (String) -> String): String {
        val sb = StringBuilder(this)
        sb.append(predicate)
        return sb.toString()
}

5 个答案:

答案 0 :(得分:2)

如果我正确理解您想将lambda的结果附加到原始String上,则应该这样做:

fun String.myAdd(predicate: (String) -> String): String {
    val sb = StringBuilder(this)
    sb.append(predicate(this))
    return sb.toString()
}

另外,predicate是一个非常令人困惑的名称,例如,它可能应该是其他名称,transform

答案 1 :(得分:2)

如果您感到幸运:

infix fun String.myAdd(transform: (String) -> String) = this + transform(this)

因此您可以致电:

"abc" myAdd { "de" }

或跳过中缀:

fun String.myAdd(transform: (String) -> String) = this + transform(this)

并通过以下方式致电:

"abc".myAdd { "de" }

这两个都将导致:

"abcde"

请注意,两种解决方案都允许在添加之前将当前字符串传递给给定的转换函数。如果您一开始不想要这个,而是想要一个供应商,那么您可能想要使用以下内容:

fun String.myAdd(supplier: () -> String) = this + supplier()

结果仍然相同

答案 2 :(得分:2)

fun String.add(append: () -> String) = this + append()

用法:

val str = "hello".add {
    "world"
}

答案 3 :(得分:1)

您不需要传递函数,只需传递简单的library(ggplot2) library(cowplot) dataframe <- data.frame(status = c("In", "In", "In", "Out", "Out", "Out"), category = c("Before", "Because of", "After", "Before", "Because of", "After"), number = c(100000, 95000, 80000, 15000, 20000, 30000), perc = c(0.9, 0.83, 0.76, 0.09, 0.16, 0.23)) bar <- ggplot(data = dataframe, aes(x = category, y = number, fill = status)) bar + geom_bar(stat = "identity", colour = "black", width = 1) + labs(x = "Reason") + labs(y = "Number") + labs(fill = "In or out") + scale_x_discrete(limits = c("Before", "Because of", "After")) + geom_text(aes(label=number), vjust = -2) + scale_fill_manual(values = c('light grey', '#0099FF')) + background_grid(major = "y", minor = "none")

String

但是,我认为在此处创建fun String.myAdd(predicate: String): String { val sb = StringBuilder(this) sb.append(predicate) return sb.toString() } 并不合理。 但是,如果只是教程,那很好。

更新1

如果您需要lambda,它将类似于:

Stringbuilder

更新2

  

我希望编写一个lambda,它接受一个字符串参数,并产生与结果相同的字符串。我该怎么写lambda?

fun String.myAdd(predicate: () -> String): String {
    val sb = StringBuilder(this)
    sb.append(predicate.invoke())
    return sb.toString()
}

答案 4 :(得分:1)

扩展功能的最简单版本可以是:

fun String.myAdd(append: (String) -> String): String {
    return this + append(this)
}

要调用您的函数,您应该编写:

println("Hello, world!".myAdd { 
    "XD"
})

它将打印Hello, world!XD

您的代码不起作用,因为您没有传递给sb.append类型的对象,而没有传递给String String -> String。如果要调用此函数,只需在其后写(argument)(或使用方法invoke(args)),然后将调用您的append(根据上面的代码),并简单地返回String 。

实际上,还请注意,您传递了append对象(在我的情况下为字符串this)作为高阶函数(在我的情况下称为Hello)的参数。

println("Hello".myAdd {
    it.reversed()
}

它将打印HelloolleH