Scala中的可变方法参数

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真的让我没有多少选择....

sep*_*p2k 8

您可以通过执行操作将项目放入b索引.那是对此没有影响的.它只是意味着你不能重新分配(无论如何这都没有用).ib(i) = whateverbvalb


Dav*_*low 6

只是在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你正在制作ba命名同一件事(不是副本,完全相同的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 ...)是.它没有显示那么多,因为这些类/类型无论如何都是不可变的.


mis*_*tor 5

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仍然是可变的,您可以修改其内容.

  • 有时我想知道@missingfaktor在哪里找到时间到处都是:-) (2认同)
  • @olle kullberg我认为,这是一个在一个帐户下工作的开发团队:) (2认同)