android - 为什么它有时代表整个字符串,有时代表 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) }
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' }
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()
}
解决方案
你可能知道,it
是指传入闭包的单个参数。
filter
接受类型的闭包(Char) -> Boolean
,所以it
的类型是Char
. it
每个 char in的原因ab1c
是因为如何filter
实现。filter
循环遍历序列并根据谓词检查每个元素。
let
另一方面,是完全不同的方法,所以他们的行为不同是很自然的。let
接受类型的闭包(String) -> Unit
(假设sendEmail
返回Unit
)。它所做的只是调用闭包this
作为参数,所以it
指的是你调用的东西let
。
推荐阅读
- python - 完成 Keras Lambda 混淆
- python - 如何基于 lambda 删除行
- javascript - 用 Javascript 编写分支的最有效方法
- javascript - 在javascript中访问html表中的文本字段
- docker - sha256 与 kubernetes 中的环境不匹配
- react-native - React Native App 不显示 console.logs()
- sql - 在 IMPALA 中将科学记数法转换为整数
- mysql - 如何在 Yii2 查询中使用复杂的表达式
- ios - 如何在 Swift 4 的 if let 语句中返回一个值?
- visual-studio-code - 如何在 Visual Studio Code Python 模块中禁用单元测试的自动发现