Maa*_*ten 1 parameters scala mutable
简单问题:我在Scala中继承了一个FilterInputStream,它有一个read方法:
public void read(byte [] b,int offset,int len)
Run Code Online (Sandbox Code Playgroud)
正在读取的数据将被放入b中,但由于参数在Scala方法中是"vals",我认为无法正确地对其进行子类化.如何将b设置为正在读取的数据?Java*InputStream真的让我没有多少选择....
只是在Scala中声明某些东西val而不是var它不会使它变得不可变.实际上,var可以命名一个不可变的值.要记住的是,Scala中的变量(与Java中的变量非常相似)始终是*引用或句柄,而不是实际包含该值.
在你的REPL中尝试这个:
class Container { var content: String = "default" }
val a = new Container
val b = a
b.content = "modified"
println(a.content)
Run Code Online (Sandbox Code Playgroud)
当你运行时,val b = a你正在制作b和a命名同一件事(不是副本,完全相同的Container实例).正因为如此,当你运行时b.content = "modified",变化也会反映出来a; 它只是同一件事的另一个名字.请注意,即使a是val,也会发生这种情况.所有val方法都是你无法改变a名称的实例.
现在想想这个微小的变化:
class Container { var content: String = "default" }
def update(c: Container) { c.content = "modified" }
val a = new Container
update(a)
println(a.content)
Run Code Online (Sandbox Code Playgroud)
当你调用update,它的参数c是也是一个参考或别名a.因此,更改会在方法调用之外反映,就像它们在前面的示例中一样.
数组是可变的,所以它们也是这样的.
*:原始变量(字节,双精度,整数等)不是Java中的引用; 他们的盒装等价物(java.lang.Byte ...)是.它没有显示那么多,因为这些类/类型无论如何都是不可变的.
def read(b: Array[Byte], offset: Int, len: Int): Unit
Run Code Online (Sandbox Code Playgroud)
与Java中的以下内容相同:
public void read(final byte[] b, final int offset, final int len)
Run Code Online (Sandbox Code Playgroud)
该数组b仍然是可变的,您可以修改其内容.
| 归档时间: |
|
| 查看次数: |
3856 次 |
| 最近记录: |