在代码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()
}
答案 0 :(得分:5)
您可能知道,it
指的是传递给闭包的单个参数。
filter
接受类型(Char) -> Boolean
的闭包,因此it
的类型为Char
。 it
是ab1c
中每个字符的原因是因为如何实现filter
。 filter
遍历序列,并针对谓词检查每个元素。
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
表示。