2017-01-13 3 views
0
for(counter <- 1 to 10) println(counter) 

どのようなタイプの可変カウンタですか? varまたはval。浮動小数点型のFOR式でのスカラー

答えはValです。今明らかな問題は、それがvalならば、出力は0、...、9となります。つまり、「カウンタ」変数の値は各反復にわたって変更されます。つまり、毎回カウンタが別の値に再割り当てされます。

カウンタ「の値 『』変数は、各繰り返し切り換えられる」 -

おっと間違っ - 正しい 「カウンタが異なる値にするたびに再割り当てされています」。どのように可能ですか?

のx =新しいフルーツ(「アップル」)(フルーツの名前と呼ばれる性質を持つ、クラスである)

が今どのように私はのための新しい値を取得することができます(スカラ座とJavaの両方のために)のは、JVMが働いていた方法を見てみましょうx、2つの方法があります。オブジェクトを作成しながらメモリについて少し話すことを理解する。 この場合、オブジェクトは値 "Apple"のヒープメモリ内に作成され、アドレスは "xxxx"となります。 xは値 "xxx"を持つスタックに入ります。今、y = xのように、同じオブジェクトが他のオブジェクトによって参照されるようになりました。どちらも値 "Apple"を持つ同じオブジェクトを指しています。 新しいオブジェクトz = new String( "Banana")を作成します。

は、xの新しい値を取得するには

  1. y.name = "オレンジ" - >オブジェクト値
  2. のx = zの変更 - > Zに再割り当てを

場合xはval(finalはJava)で、way 2は可能ではありませんがway 1はokです。結論は、あなたがvalまたはfinalを宣言すると(javaで)、そのrefを新しいrefに再割り当てすることはできませんが、pointedオブジェクトは変更できます。 ref( "xxx")の値はvalの場合は変更できません。 for(counter <- 1 to 10) println(counter)ここでは、「カウンタ」はvalであるため、カウンタは新しい値に再割り当てされませんが、カウンタによって指されるオブジェクトは毎回変更されます。

また、スカラの「FOR」は式ではなく、式です。違いは.expressionは常にいくつかのことを返されますが、文はいずれかを返すことはありません。

は、誰もが

+0

http://stackoverflow.com/questions/40860218/undesired-behavior-of-val-in-for -loop-in-scala/40860578#40860578。私の答えは投稿で見つけてください。 – BDR

答えて

2

答えがforをということで、他の意見を持っている場合は私に知らせてください(DO-しばらくはScalaでは文がある間) foreach高次関数の構文的な砂糖です。 まずは1 to 10とは何ですか?さて、それはscala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)です。

forは、レンジ、コレクションの各要素に適用される高階関数があり、これは、ValまたはVARへの割り当てはありません

Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).foreach(count => println(count)) と同じであり、実際に1 10の範囲でforeachの呼び出しです。不変の範囲の各要素がval - yesであると言うことができるので、その数もvalです。

は は

我々はまったく割り当てがないのforeachで、カウントを持っている場合は、レンジの上のforeachの定義を見てみましょ :

def foreach[U](f: Int => U): Unit

foreachのは、引数としての機能を受け入れ、引数が持っている機能である必要がありますint型のパラメータで何も返さないので、ここでのcountは引数名だけです。引数はデフォルトでスカラのvalです。

関連する問題