首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

聊聊kotlin中的run, let, with, apply, also ...

导语: kotlin 标准库中, run, let, with, apply, also 实现解读 在看kotlin代码时, 可能会看到let, run这样的函数调用, 最早接触的时候, 我也弄不清楚其中差异...kotlin中, run, let, with, apply, also, 都是标准库的函数, 它的实现可以直接在IDE上跳转看到, 也可以在这里看: Standard.kt 看这些函数的实现, 会发现它们非常短...这个BLOCK和run函数的extension函数版本的block参数, 是等价的. apply函数, also函数 - public inline fun T.apply(block: T.() -...return this } 剩下apply和also两个函数, 他们和run, let的实现又非常相似 apply和T.run的block参数的上下文一致 also和T.let的block参数的上下文一致..., 应该就对run, let, with, apply, also的差异完全明了 思考 在上边的实例代码中, T.run, T.apply, with(T)对应的block中, 怎么拿到TestDemo

1.3K70
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Kotlin中的let、with、run、apply、also常用场景

    常见场景的使用 let 处理需要针对一个可null的对象统一做判空处理 private var textView: TextView?...,可以省去类名重复,直接调用类的方法即可 var bean=Bean("小米",12) //没使用 with前 var s1=bean.name+bean.age...with函数传入对象判空问题,在run函数中可以像let函数一样做判空处理 apply 整体作用功能和run函数很像,唯一不同点就是它返回的值是对象本身,而run函数是一个闭包形式返回,返回的是最后一行的值...正是基于这一点差异它的适用场景稍微与run函数有点不一样。apply一般用于一个对象实例初始化的时候,需要对对象中的属性进行赋值。...also 适用于let函数的任何场景,also函数和let很像,只是唯一的不同点就是let函数最后的返回值是最后一行的返回值而also函数的返回值是返回当前的这个对象。一般可用于多个扩展函数链式调用

    1.4K10

    kotlin标准库扩展之 let run apply also(一)

    kotlin十分简便系统为我们提供了一些十分简便的标准库扩展,今天我们就看看这些常规的使用频率比较高的能帮助我们加速开发的标准库吧 let 对于学习Kotlin这门语言的人来说肯定都知道其一个特点--...不停的使用if判断显然是不合乎设计的,于是我么的let应运而生 The Kotlin standard library function let can be used for scoping and...null 和 my string分别作为参数测试时null并没有走let这个闭包,从而可以看出let只有在非null的情况下才会走对应的闭包 run 和let相似,run是标准库的另一个扩展。...不同的是run内部走的是一个this的引用,这要说明了内部你可以直接调用对已实例自身的方法 fun runFun() { fun getNullableLengt(ns: String) {...this是完全可以省略的,我们只是为了让大家看的明显才吧对应的this添加进去而已

    46310

    【Kotlin】标准库函数 ③ ( with 标准库函数 | also 标准库函数 )

    函数的 参数 ; with 函数原型 : /** * 以给定的[receiver]作为接收者调用指定的函数[block]并返回其结果。...(str) } 执行结果 : Hello 二、also 标准库函数 ---- also 函数 功能与 let 函数 功能 类似 ; also 函数 将 接收者 ( 函数调用者 ) 作为参数传递给 Lambda...表达式参数 , 并返回 接收者实例对象本身 ; also 函数 与 let 函数 返回值不同 , also 函数 返回 接收者对象本身 , let 函数 返回 Lambda 表达式的最后一行 ; also...函数 返回 接收者对象本身 , 那么就可以使用该特性 , 对 接收者 执行 函数式编程的 链式调用 ; 代码示例 : fun main() { val str = "hello".also {...println(it) }.also { // 该对象的生命周期仅限于该闭包 println(it.capitalize()) }

    82910

    文件的指针位置

    (f.tell()) # 更改文件指针的位置 seek(偏移量,whence) # 偏移量是数字,距离whence字符数 # whence:0:文件开头 1:当前位置 2:文件结尾 seek(10,0...nccccc\nddddd\n') # f.seek(4,0) f.seek(0, 0) print(f.read()) print('='*10) # aaaaa\r\nbbbbb,这串数字从第五,第六个位置打印后两位是一样的...f.seek(6, 0) # seek 移动鼠标位置(位数)包含\r\n,读取时(位数)不包含\r print(f.read(2))...# 本来是光标移动到开始0,打印光标后七个的最后一个,和光标移动到第六个,打印后一个是一样的 print('-'*10) # 第六个位置是\r,第七个位置是\n,所以读七个不包括\r,会打出来...# windows \r\n \r表示回行首 \n换行 # unix/linux \n # mac \r # 这里的‘指针测试.txt’文件里的内容如下: # aaaaa # bbbbb #

    1.4K40

    Kotlin 中的 run、let、with、apply、also、takeIf、takeUnless 语法糖使用和原理分析

    在 Kotlin 有一些可以简化代码的语法糖,比如 run、let、with、apply、also、takeIf、takeUnless 等。...而带接收者的函数字面值,就是在作为传入参数的函数变量的具体函数形式的参数前面多了接收者对象,简单说就是在 ()前面多了一个点和一个对象,成了如下的形式: fun exec(invoke: ReceiveObject...also 语法糖 public inline fun T.also(block: (T) -> Unit): T { block(this) return this } also...调用示例: var result = "a".also { it.plus("b") } takeIf 语法糖 public...最后,光是了解他们的原理和调用情况还是不够的,再不影响代码阅读的情况下要把它们引入到我们的代码中去,灵活地使用它们。

    2.2K11

    聚焦位置-选择您喜欢的位置放置虚拟物体

    我们现在能够看到它,但它的位置并不理想,就好像它是在相机的起始位置,这是世界起源。最重要的是,它是空闲的。我们希望它在场景中移动,以便我们可以选择一个位置来添加模型。...let hitTestResult = hitTest.first 世界变换 命中测试的目的是检索表面的位置。并且该位置存储在世界变换中。世界变换是命中测试结果相对于世界坐标的节点变换属性。...简而言之,这些结果包含有关变换的信息,如方向,位置和比例。 guard let worldTransform = hitTestResult?....worldTransform else {return} 世界变换是一个4x4矩阵,位置保留在第四列。因为矩阵是多维数组并且数组的值从0开始,所以第四列的数量是3。...let worldTransformColumn3 = worldTransform.columns.3 最后,将该位置指定给焦点方块。同时,它会随着相机的移动而更新。

    2.4K30

    基于位置的点击模型

    主流的点击模型大都基于点击模型方面最基础的研究,认为用户在浏览搜索引擎时采用的是沿着搜索结果列表从上到下依次浏览的方式,根据这个假设,用户的浏览顺序与搜索结果的位置顺序是一致的。...因此大多数的点击模型都是基于位置的构建方式(我们称作基于位置的点击模型)。...,即检验度(直观来说,就是这个搜索结果能否被用户观测到,更进一步说,文档是否处于显眼的位置,更往前的搜索结果被检验到的概率更大),在 PBM 的假设中检验度仅仅和搜索结果的位置有关,是独立概率; 文档是否能吸引用户...PBM 的概率图模型下图所示: PBM 的概率公式如下: 其中 P(Au​=1)=αuq​,α表示吸引度,仅与搜索词q与文档u有关;P(Eu​=1)=γur​​,γ表示检验度,仅与文档所处位置...但与 PBM 的不同点在于,是否被检验由排序在此文档前的所有文档是否被点击共同决定,我们假设检验概率不仅依赖于文档的位置 r也依赖于上一个点击文档位置 r′。

    1.1K20
    领券