为什么它有时表示整个字符串,有时又表示Kotlin中的每个字符?

时间:2018-07-26 00:55:23

标签: android kotlin

在代码A中,此 是电子邮件"yole@example.com",在代码B中,此 it < / strong>是'a'中的每个单个字符'b''1''c'"ab1c",为什么?

代码A

fun main(args: Array<String>) {
    var email: String? = "yole@example.com"
    email?.let { sendEmailTo(it) }  //This it is the email "yole@example.com"
}

fun sendEmailTo(email: String) {
    println("Sending email to $email")
}

代码B

fun main(args: Array<String>) {
    println("ab1c".filter { it in 'a'..'z' })  //This it is char  'a', 'b,' '1','c' of "ab1c"
}


fun String.filter(predicate: (Char) -> Boolean): String {
    val sb = StringBuilder()
    for (index in 0 until length) {
        val element = get(index)
        if (predicate(element)) sb.append(element)
    }
    return sb.toString()
}

添加的内容

代码C

如果使用其他扩展名,我将得到相同的结果。

fun main(args: Array<String>) {
    println("ab1c".myFun { it in 'a'..'z' })  //This it is char  'a', 'b,' '1','c' of "ab1c"
}

fun String.myFun(predicate: (Char) -> Boolean): String {
        val sb = StringBuilder()
        for (index in 0 until length) {
            val element = get(index)
            if (predicate(element)) sb.append(element)
        }
        return sb.toString()
}

更新的内容

我认为此代表的是这些扩展乐趣的细节。对?所以有时候我需要阅读有趣的扩展源代码!

email?.let { sendEmailTo(it) }中的这个 it 代表email,因为有趣的block要求这样做。

来源A

public inline fun <T, R> T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

"ab1c".filter { it in 'a'..'z' }中的此 it 表示char,因为有趣的predicate在此String对象中需要char并执行for循环操作。

来源B

fun String.filter(predicate: (Char) -> Boolean): String {
    val sb = StringBuilder()
    for (index in 0 until length) {
        val element = get(index)
        if (predicate(element)) sb.append(element)
    }
    return sb.toString()
}

2 个答案:

答案 0 :(得分:5)

您可能知道,it指的是传递给闭包的单个参数。

filter接受类型(Char) -> Boolean的闭包,因此it的类型为Charitab1c中每个字符的原因是因为如何实现filterfilter遍历序列,并针对谓词检查每个元素。

另一方面,

let是一种完全不同的方法,因此自然而然地改变了它们的行为。 let接受类型(String) -> Unit的闭包(假设sendEmail返回Unit)。而它所做的只是调用以this作为参数的闭包,因此it指的是您调用let的事物。

答案 1 :(得分:3)

这两种方法:

email?.let { sendEmailTo(it) }  //This it is the email "yole@example.com"
println("ab1c".filter { it in 'a'..'z' })  //This it is char  'a', 'b,' '1','c' of "ab1c"

等同于:

email?.let(fun (string: String) {
    sendEmailTo(string)
})

println("ab1c".filter(fun (char: Char): Boolean {
    return char in 'a'..'z'
}))

如您所见,it在第一种方法中引用string,在第二种方法中引用char。它们是两种不同的东西,只是为了方便起见可以用it表示。