obj.apply{func1()}的结果与obj.func1(()不同



在kotlin中,apply{}被定义为inline fun <T> T.apply(block: T.() -> Unit): T
我认为使用此函数是为了最小化此代码

obj.func1()
obj.func2()
obj.func3()
...

obj.apply {
func1()
func2()
func3()
}

但现在我认为它有一些完全不同的实际用例。在我的android工作室项目中,我得到了这个日志

2020-12-08 13:3:22.648 28006-28006/com.skb.skara D/VideoViewActivity: onStart: pos 2677
2020-12-08 13:3:22.649 28006-28006/com.skb.skara D/VideoViewActivity: initializePlayer: seeked to 0
2020-12-08 13:3:22.650 28006-28006/com.skb.skara D/VideoViewActivity: onStart: pos 2677

对于这个代码

private var currentPosition: Int
override fun onStart() {
super.onStart()
Log.d(TAG, "onStart: pos $currentPosition")
initializePlayer()
Log.d(TAG, "onStart: pos $currentPosition")
if (currentPosition == 0) {
Log.d(TAG, "onStart: vid start")
fullscreen_video.start()
}
show()
}
private fun initializePlayer() {
fullscreen_video.apply {
setVideoPath(videoUrl)
seekTo(currentPosition)
Log.d(TAG, "initializePlayer: seeked to $currentPosition")
}
}

然后我把initialisePlayer的功能改成了这个

private fun initializePlayer() {
fullscreen_video.setVideoPath(videoUrl)
fullscreen_video.seekTo(currentPosition)
Log.d(TAG, "initializePlayer: seeked to $currentPosition")
}

然后我得到了这个日志

2020-12-08 13:12:53.548 28006-28006/com.skb.skara D/VideoViewActivity: onStart: 2677
2020-12-08 13:12:53.550 28006-28006/com.skb.skara D/VideoViewActivity: initializePlayer: seeked to 2677
2020-12-08 13:12:53.550 28006-28006/com.skb.skara D/VideoViewActivity: onStart: 2677

请有人解释这种行为,并解释作用域函数apply{}的使用

小心,VideoView有自己的currentPosition。访问其apply块内的currentPosition将获得VideoView的currentPosition。

private fun initializePlayer() {
fullscreen_video.apply {
setVideoPath(videoUrl)
seekTo(currentPosition) // This will use VideoView.currentPosition
Log.d(TAG, "initializePlayer: seeked to $currentPosition") // This, too
}
}

解释apply:

上下文对象可用作接收器(this(。并且CCD_ 11总是可以省略的。

如果要访问上面声明的currentPosition,请使用this@YourActivity.currentPosition。将YourActivity替换为您的活动。

请参阅下表,在的范围内,this.currentPositionfullscreen_video.currentPosition,而不是您的var currentPosition

Kotlin的示波器操作员就像一把瑞士军刀,每种情况都有一种方法。

https://kotlinlang.org/docs/reference/scope-functions.html

扩展函数ambda结果//tr>//tr>:在没有上下文对象的情况下调用>否:将上下文对象作为参数应用上下文对象上下文对象
函数 对象引用 返回值
let it
运行 Lambda结果
运行 - Lambda结果
Lambda结果

最新更新