単純な問題:読み取りメソッドを持つScalaでFilterInputStreamをサブクラス化しています:
public void read(byte [] b,int offset,int len)
読み取られるデータはbに入れられますが、パラメーターはScalaメソッドの「vals」であるため、これを適切にサブクラス化する方法がわかりません。読み取るデータにbを設定するにはどうすればよいですか?Java * InputStreamは、私にあまり選択肢を残しません。
単純な問題:読み取りメソッドを持つScalaでFilterInputStreamをサブクラス化しています:
public void read(byte [] b,int offset,int len)
読み取られるデータはbに入れられますが、パラメーターはScalaメソッドの「vals」であるため、これを適切にサブクラス化する方法がわかりません。読み取るデータにbを設定するにはどうすればよいですか?Java * InputStreamは、私にあまり選択肢を残しません。
を実行するだけで、アイテムをb
at indexに入れることができます。それはこれには影響しません。これは、再割り当てができないことを意味するだけです(これを行うのは役に立ちません)。i
b(i) = whatever
b
val
b
val
Scalaで a ではなく aとして宣言するだけではvar
、不変にはなりません。実際、var
不変の値に名前を付けることができます。覚えておくべきことは、Scala の変数は、Java の変数と同じように、実際に値を含むのではなく、常に*参照またはハンドルであるということです。
REPL でこれを試してください:
class Container { var content: String = "default" }
val a = new Container
val b = a
b.content = "modified"
println(a.content)
実行すると、同じもの (コピーではなく、コンテナのまったく同じインスタンス) の名前val b = a
が作成されます。このため、実行すると変更も反映されます。それは同じものの別の名前です。これは valであっても発生することに注意してください。すべての手段は、どのインスタンスの名前を変更できないかということです。b
a
b.content = "modified"
a
a
val
a
次に、このわずかな違いについて考えてみましょう。
class Container { var content: String = "default" }
def update(c: Container) { c.content = "modified" }
val a = new Container
update(a)
println(a.content)
を呼び出す場合update
、そのパラメータc
はの参照またはエイリアスでもa
あります。したがって、変更は、前の例と同じようにメソッド呼び出しの外部に反映されます。
配列は変更可能であるため、このようにも機能します。
*: プリミティブ変数 (bytes、double、int など) は Java では参照されません。それらのボックス化された同等物 (java.lang.Byte...) は次のとおりです。とにかくこれらのクラス/タイプは不変であるため、それほど多くはありません。
def read(b: Array[Byte], offset: Int, len: Int): Unit
Javaで次のことと同等です:
public void read(final byte[] b, final int offset, final int len)
配列b
は引き続き可変であり、その内容を変更できます。