Scala能否实现类似C++引用的变量共享修改及返回引用?
在Scala中实现类似C++引用的逻辑
当然可以实现你要的等效逻辑,但因为Scala基于JVM运行,内存模型和C有差异——JVM里的基本类型(如Int)都是不可变值类型,没有C那种直接指向内存地址的引用机制。不过我们可以通过包装类来模拟这种“共享可变状态”的效果,具体来看:
一、实现两个变量指向同一对象并共享修改
核心思路是把基本类型包裹在一个可变的引用类型里,这样多个变量就可以指向同一个对象,修改对象内部的值时,所有指向它的变量都会看到变化。
方式1:自定义简单包装类
自己写一个极简的包装类是最直观的方式:
// 定义一个可写的Int包装类,内部用var存储值 class WritableInt(var value: Int) // 使用示例 val x = new WritableInt(1) val rx = x // rx和x指向同一个WritableInt对象 rx.value += 1 // 修改对象内部的值 println(x.value) // 输出:2
方式2:使用Scala标准库的可变类型
Scala标准库提供了现成的可变数值包装类,比如scala.collection.mutable.MutableInt:
import scala.collection.mutable.MutableInt val x = MutableInt(1) val rx = x rx += 1 // 直接调用包装类的+=方法修改内部值 println(x) // 输出:2
注意:别把Scala的
var和C++的引用搞混!比如var x = 1; var rx = x; rx +=1,这里rx只是重新赋值了一个新的Int值,x还是1——因为Int是值类型,rx拿到的是x的副本,不是引用。
二、函数返回这类“引用”
完全可以!因为这些包装类都是普通的对象,函数返回它们的引用后,外部拿到的还是同一个对象,修改它会影响原对象:
用自定义包装类的例子:
class WritableInt(var value: Int) // 函数返回传入的WritableInt对象引用 def getSharedReference(original: WritableInt): WritableInt = original // 使用示例 val x = new WritableInt(1) val rx = getSharedReference(x) rx.value += 1 println(x.value) // 输出:2
用标准库MutableInt的例子:
import scala.collection.mutable.MutableInt def getIntReference(mi: MutableInt): MutableInt = mi val x = MutableInt(1) val rx = getIntReference(x) rx += 1 println(x) // 输出:2
总结一下:Scala没有C++那样的原生引用,但通过可变引用类型的包装,完全可以实现“多个变量共享同一状态,修改一个影响全部”的效果,而且函数也可以返回这类包装对象的引用。
内容的提问来源于stack exchange,提问作者black-goat
相关产品推荐
相关产品推荐

