和申请有什么区别.据我所知,下面的代码做了同样的事情:
swingElement.apply {
minWidth = ENABLED_COLUMN_WIDTH
maxWidth = ENABLED_COLUMN_WIDTH
preferredWidth = ENABLED_COLUMN_WIDTH
}
with(swingElement) {
minWidth = ENABLED_COLUMN_WIDTH
maxWidth = ENABLED_COLUMN_WIDTH
preferredWidth = ENABLED_COLUMN_WIDTH
}
Run Code Online (Sandbox Code Playgroud)
有什么区别,我应该使用一个吗?此外,是否有一些情况下,一个人会工作,另一个不会?
Mic*_*ael 66
有两点不同:
apply接受一个实例作为接收器,同时with需要将一个实例作为参数传递.在这两种情况下,实例都将成为this一个块.
apply返回接收器并with返回其块中最后一个表达式的结果.
我不确定可以选择哪种功能的严格规则.通常apply在需要对某个对象执行某些操作并将其返回时使用.当你需要对一个对象执行一些操作并返回一些其他对象时,你可以使用with或者run.我更喜欢,run因为在我看来它更具可读性,但这是一个品味问题.
apply功能//returns receiver T, T exposed as `this`
fun <T> T.apply(block: T.() -> Unit): T
Run Code Online (Sandbox Code Playgroud)
描述
该apply函数在接收器上调用,接收器T将this在传递的lambda表达式中公开.接收器也成为apply自动的结果.
with功能//return arbitrary value R, not an extension function, T exposed as `this`
fun <T, R> with(receiver: T, block: T.() -> R): R
Run Code Online (Sandbox Code Playgroud)
描述
的with功能,而不是所有其他范围的函数(let,run,also,apply),则没有被定义为一个扩展函数.相反,使用接收器对象作为其第一个参数显式调用该函数.同样apply,接收器暴露this在传递的lambda中.lambda的结果,即它的最后一个语句,成为结果(R)with.
这是相同点和不同点
With和Apply都以任何方式接受一个对象作为接收者。
With返回 lambda 中的最后一行作为表达式的结果。
Apply返回作为 lambda 表达式结果作为接收者传入的对象。
private val ORIENTATIONS = with(SparseIntArray()) {
append(Surface.ROTATION_0, 90)
append(Surface.ROTATION_90, 0)
append(Surface.ROTATION_180, 270)
append(Surface.ROTATION_270, 180)
}
ORIENTATIONS[0] // doesn't work
// Here, using with prevents me from accessing the items in the SparseArray because,
// the last line actually returns nothing
Run Code Online (Sandbox Code Playgroud)
private val ORIENTATIONS = SparseIntArray().apply {
append(Surface.ROTATION_0, 90)
append(Surface.ROTATION_90, 0)
append(Surface.ROTATION_180, 270)
append(Surface.ROTATION_270, 180)
}
ORIENTATIONS[0] // Works
// Here, using apply, allows me to access the items in the SparseArray because,
// the SparseArray is returned as the result of the expression
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11631 次 |
| 最近记录: |