2015-10-18 18 views
6

c'è qualcuno che possa spiegarmi per cosa viene utilizzata la funzione "con"?Utilizzo della funzione "con"

Firma

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

Doc

chiamate la funzione specificata f con il ricevitore dato come suo ricevitore e restituisce il risultato.

E ho trovato il suo utilizzo su questo progetto Antonio Leiva. E 'stato utilizzato per la visualizzazione in movimento:

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

stavo pensando che io conosco il significato di trasferisco a

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

ma non viene compilato correttamente ... Ma io penso che sia il ricevitore ObjectAnimaton e ottiene tutto ciò che chiamerò nella parentesi {}. Qualcuno può spiegare il vero significato e fornire un esempio di base, almeno di base? : D

+0

'with' è il nome della funzione (con i parametri del tipo' 'T' e R'), non una parola chiave. Una parola chiave è una parola con un significato specifico nella lingua, non con un significato specifico in un'API, anche se è l'API di base. –

+0

hai ragione, l'ho modificato – United121

+0

Non c'è niente di sbagliato nella domanda, l'ho formattato un po 'di più se non ti dispiace. Si noti che non è necessario ripetere la lingua/runtime nel titolo, questo è ciò che i tag sono per. –

risposta

3

L'idea è la stessa della parola chiave with in Pascal.
Comunque, qui sono tre campioni con identico semantica:

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

Penso di aver capito cosa fare "with". Guardate il codice:

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

} 

Se eseguo questo codice ottengo una chiamata di someFunciton con 20 e poi con 30 parametri.

Così il codice di cui sopra può essere tranfer a questo:

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

e dovrebbe funzionare - così dobbiamo avere var.

Problemi correlati