当一个变量更改时,两个变量是否可以引用同一个对象并且都会更改值

时间:2018-04-02 08:57:32

标签: scala

基本上,我的问题是Scala中是否可以使用这个C ++代码?

int x = 1;
int& rx = x;
rx++; // x = 2 now
std::cout << x;

即。有两个不同的变量都指向同一个东西(当其中一个变化时,两个变量都会改变)?

另外,如果是,scala函数可以返回这样的引用吗?

3 个答案:

答案 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;到内存中的任意位置。

但请注意,该数组将驻留在堆上(通常,除非通过某些转义分析消除它),否则不能将其保留在函数的堆栈框架中。