首页 > 解决方案 > 为什么它有时代表整个字符串,有时代表 Kotlin 中的每个字符?

问题描述

在代码 A 中,这email "yole@example.com",在代码 B 中,这每个 char 'a''b''1''c'of "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) }emailblock

来源 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' }char 因为乐趣需要在这个 String 对象中predicate使用 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()
}

标签: androidkotlin

解决方案


你可能知道,it是指传入闭包的单个参数。

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

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


推荐阅读