2015-10-18 9 views
6

"with"関数が使用されていることを私に説明できる誰かがいますか?"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

+0

'WITH'は、(型パラメータ 'T'と' R'付き)関数の名前ではありません。ここではとにかく
は、同じセマンティックを持つ三つのサンプルがありますキーワード。キーワードは、その言語で特定の意味を持つ単語であり、基本APIであっても、APIの特定の意味ではありません。 –

+0

あなたは正しいです、私は編集しました – United121

+0

質問に間違いはありません。タイトルで言語/ランタイムを繰り返す必要はないことに注意してください。これはタグのためです。 –

答えて

3

このアイデアは、パスカルのwithキーワードと同じです。

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

私は "持っている"ことを理解したと思います。コードを見てください:

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の呼び出しが1回発生します。

ので、上記のコードはこれにtranferすることができます:

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を持っている必要があります。

関連する問題