在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.currentPosition
是fullscreen_video.currentPosition
,而不是您的var currentPosition
Kotlin的示波器操作员就像一把瑞士军刀,每种情况都有一种方法。
https://kotlinlang.org/docs/reference/scope-functions.html
函数 | 对象引用 | 返回值 | 扩展函数
---|---|---|
let | it | ambda结果是 | //tr>
运行 | 此 | Lambda结果 | //tr>
运行 | - | Lambda结果 | :在没有上下文对象的情况下调用
与 | 此 | Lambda结果 | >否:将上下文对象作为参数