基本上,我的问题是Scala中是否可以使用这个C ++代码?
int x = 1;
int& rx = x;
rx++; // x = 2 now
std::cout << x;
即。有两个不同的变量都指向同一个东西(当其中一个变化时,两个变量都会改变)?
另外,如果是,scala函数可以返回这样的引用吗?
答案 0 :(得分:1)
嗯,你不能。在Scala中,Int,Double,Float,Boolean等是AnyVal,你不能通过引用传递它们。您可以传递AnyRef的引用,即String,List,Set,Any用户定义的对象等。
答案 1 :(得分:1)
你可以模仿它:
class Ref[A](var value: A)
object Ref { def apply[A](a: A) = new Ref(a) }
val a = Ref(1)
val b = a
b.value += 1
println(a.value) // 2
甚至:
class Ref[A](get: => A)(set: A => Unit) {
def value = get
def value_=(a: A): Unit = set(a)
}
var a = 1
val b = new Ref(a)(a = _)
b.value += 1
println(a) // 2
在这种情况下,您可能会编写一个宏来构建Ref
更漂亮(例如Ref(a)
,并且宏会生成相应的闭包)。
答案 2 :(得分:0)
对于C / C ++程序员来说,Java / Scala中常见的解决方法如下:
val x = Array[Int](41)
val rx = x
rx(0) += 1
println(x(0))
您不能拥有对原始整数变量的引用或指针,但是数组包含与指针等效的信息,因此如果您将x
声明为具有单个元素而不是{Array[Int]
的{{1}} {1}},您获得大致相同的行为:上面的示例将打印Int
。
你可以这样想:
42
大致对应C中的Array[X]
,后者大致对应X[]
X*
对应于访问&#34;指针&#34;的值。 x(0)
,所以它与C中的x
类似。关键的区别在于你只能从一开始就声明一个数组。没有办法得到一个&#34;指针&#34;到内存中的任意位置。
但请注意,该数组将驻留在堆上(通常,除非通过某些转义分析消除它),否则不能将其保留在函数的堆栈框架中。