使用“with”功能

时间:2015-10-18 13:33:45

标签: android animation kotlin

是否有人可以解释我使用“with”功能的原因?

签名

public inline fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()

文档

  

使用给定的接收器作为接收器调用指定的函数f并返回其结果。

我发现它在这个项目上使用Antonio Leiva。它用于移动视图:

fun View.animateTranslationY(translationY: Int, interpolator: Interpolator) {
    with(ObjectAnimator.ofFloat(this, "translationY", translationY.toFloat())) {
        setDuration(context.resources.getInteger(R.integer.config_mediumAnimTime).toLong())
        setInterpolator(interpolator)
        start()
    }
}

我在想我知道将其转移到

的含义
fun View.animateTranslationX(translationX: Int, interpolator: Interpolator) {
    with(ObjectAnimator()) {
        ofFloat(this, "translationX", translationX.toFloat())
        setDuration(context.resources.getInteger(R.integer.config_mediumAnimTime).toLong())
        setInterpolator(interpolator)
        start()
    }
}

但是它没有编译......但是我认为ObjectAnimaton是接收器,它会得到我将在{}括号中调用的所有内容。任何人都可以解释真正的意义并提供一个基本的例子 - 至少比这更基本吗? :d

2 个答案:

答案 0 :(得分:3)

这个想法与Pascal中的with关键字相同 无论如何,这里有三个相同语义的样本:

with(x) {
   bar()
   foo()
}
with(x) {
   this.bar()
   this.foo()
}
x.bar()
x.foo()

答案 1 :(得分:0)

我认为我理解&#34;与#34;做。看代码:

class Dummy {
    var TAG = "Dummy"

    fun someFunciton(value: Int): Unit {
        Log.d(TAG, "someFunciton" + value)
        }
    }

    fun callingWith(): Unit {
    var dummy = Dummy()
    with(dummy, { 
        someFunciton(20) 
    })

    with(dummy) {
        someFunciton(30)
    }

}

如果我运行这段代码,我会用20调用someFunciton,然后调用30 param。

所以上面的代码可以转移到这个:

fun View.animateTranslationX(translationX: Int, interpolator: Interpolator) {
    var obj = ObjectAnimator()
    with(obj) {
        ofFloat(this, "translationX", translationX.toFloat())
        setDuration(context.resources.getInteger(R.integer.config_mediumAnimTime).toLong())
        setInterpolator(interpolator)
        start()
    }
}

我应该工作 - 所以我们必须有var。