2017-08-02 10 views
2

このは私が機能を再利用しようとしている

fun test(i: Int) { 
    i += 5 
} 

のようないくつかのことをパラメータが、this distinctionで述べたように

関数のパラメータはvalないvar

+0

は本当に、それは通常の引数を変更するための悪い習慣と考えられています。別の名前の新しい変数を作成し、それをパラメータに代入してから使用します。また、パラメータを 'var'として宣言できますか? – Carcigenicate

+1

@Carcigenicate Kotlinで関数のパラメータをval/varとして指定することはできません。これらは 'val'であることが暗示されています。 – Todd

+0

なぜそれは悪い習慣と考えられているのですか?それを割り当てるのを避けるために、外側のスコープのパラメータを変更したくありません。私は代入がもっと混乱していると思います。 – humazed

答えて

4

Kotlinでは、関数引数はvalとして扱われます。つまり、参照を「変更」するために、関数内で何かをしなければならないということです。

あなたのソリューションはうまくいくが、私は変数をシャドーするのは悪い習慣だと感じている。それは混乱につながり、効果が機能に局所的であることを理解している意図をかなり正確にはカバーしていません。私はこのようなものとなるだろう

fun test(i: Int) { 
    var i2 = i 
    i2 += 3 // etc... 
} 
+0

私はそれを考えましたが、私の場合、パラメータ名は幅と高さです。 と私はそれが読みにくいコードにつながるだろう名前を変更すると感じる。 – humazed

0
されるパラメータ

私が見つけた唯一の解決策は、名前シャドウイングを使用することです。つまり、そのようなものです。

fun test(i: Int) { 
    var i = i 
    i += 5 
} 

私はそれが正しい感じていないので最善の解決策場合は、さえのIntelliJ IDEAはそれについて私に警告しているかわかりません。

私は

fun test(var i: Int) { 
    i += 5 
} 

のような不思議な事を期待していたが、unfortuantlyこれはcomileさえしません。

+1

興味深いことに、Kotlinは変数名を重複して変数を定義することができます。多分それはバグです。 +1 –

+0

いいえ、それは悪い習慣です。 – humazed

+0

ありがとう、私はそれを得た。 Javaではシャドウ変数を定義することはできません。実際には、Kotlinはそのために別のローカル変数を定義しました。たとえば、var i:String = "foo" 'など、ローカル変数の型を変更することもできます。 –

関連する問題