为什么它有时代表整个字符串,并且有时代表Kotlin中的每一个字符?

Hel*_*oCW 3 android kotlin

在代码中,这个是电子邮件"yole@example.com",并在代码B,这就是每一个字符'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")
}
Run Code Online (Sandbox Code Playgroud)

代码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()
}
Run Code Online (Sandbox Code Playgroud)

添加内容

代码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()
}
Run Code Online (Sandbox Code Playgroud)

更新的内容

我想这代表了基于这些扩展有趣的细节.对?所以有时我需要阅读扩展乐趣的源代码!

email?.let { sendEmailTo(it) }代表email因为好玩block要求这一点.

来源A.

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

"ab1c".filter { it in 'a'..'z' }代表字符,因为乐趣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()
}
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 5

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

filter接受类型的闭包(Char) -> Boolean,所以it类型是Char.之所以这样it,ab1c是因为如何filter实施.filter循环遍历序列并根据谓词检查每个元素.

let另一方面,这是一种完全不同的方法,因此他们的行为自然不同.let接受类型的闭包(String) -> Unit(假设sendEmail返回Unit).它所做的只是将闭包this作为参数调用,所以it指的是你调用的东西let.