2015-10-18 10 views
6

Czy jest ktoś, kto może mi wyjaśnić, do czego służy funkcja "z"?Użycie funkcji "z"

sygnatury

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

Doc

Wywołuje określonej funkcji f z danym odbiorniku odbiornikiem i zwraca jej wynik.

Znalazłem jego użycie w tym projekcie Antonio Leiva. Został użyciem ruchomego widzenia:

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() 
    } 
} 

Myślałam, że znam znaczenie przenieść go do

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() 
    } 
} 

ale nie skompilować ... Ale myślę, że odbiornik jest ObjectAnimaton i dostaje wszystko, co wezmę w nawiasie. Czy ktokolwiek może wyjaśnić prawdziwe znaczenie i podać podstawowy przykład - przynajmniej bardziej podstawowy od tego? : D

+0

'with' to nazwa funkcji (z parametrami typu' 'R' T' a) nie słowo kluczowe. Słowo kluczowe to słowo o określonym znaczeniu w języku, a nie o określonym znaczeniu w interfejsie API, nawet jeśli jest to podstawowy interfejs API. –

+0

masz rację, ja to edytowałem – United121

+0

Nic złego w tym pytaniu, sformatowałem je trochę więcej, jeśli nie masz nic przeciwko. Zwróć uwagę, że nie trzeba powtarzać języka/środowiska wykonawczego w tytule, do tego służą znaczniki. –

Odpowiedz

3

Pomysł jest taki sam jak słowo kluczowe with w języku Pascal.
W każdym razie, tutaj są trzy próbki z identyczne semantyczny:

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

Myślę, że zrozumiałem, co "z" zrobić. Spójrz na kod:

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) 
    } 

} 

Po uruchomieniu tego kodu otrzymuję jedno wywołanie funcitonu z 20, a następnie z 30 parametrami.

więc powyższy kod może być Transfer do tego:

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() 
    } 
} 

i muszę pracować - więc musimy mieć var.

Powiązane problemy