通过引用传递但引用数据而不是变量

时间:2010-04-14 04:49:01

标签: ruby language-agnostic pass-by-reference

这是psesudo代码。用什么编程语言可以做到?

def lab(input)
  input = ['90']
end

x = ['80']
lab(x)

puts x #=> value of x has changed from ['80'] to ['90]

我用ruby编写了这个,但是在ruby中我得到的最终x值为80 因为红宝石是传递参考。然而,传递的是 引用x持有的数据而不是指向x本身的指针 在JavaScript中也是如此。所以我想知道是否有 编程语言,其中包含以下内容。

4 个答案:

答案 0 :(得分:1)

有几种语言支持pass-by-reference:它在大多数Fortran版本中隐含的时间比大多数其他编程语言已存在(某些版本使用来回复制,但最终结果最好是相同的;-),它是由70年代Pascal中的var指定的(虽然默认情况下,如果你没有说var,是副本)等等

大多数现代语言(Java,Python,Ruby,Javascript,Go,...)通过 object -reference(这就是你所说的“数据引用”)统一传递(和赋值)虽然有些更复杂,但你可以更精确地指定你想要的东西(例如,C ++,C#)。

答案 1 :(得分:1)

所以在Ruby中,你不能让x从方法中引用另一个对象,但你可以改变对象本身,在你的情况下你可以使用变异方法实现你想要的东西({{3}例如,在数组的情况下可能很方便:

def lab input
  input.replace ['90']
end

x = ['80']
#=> ["80"]
lab x
#=> ["90"]
x
#=> ["90"]

答案 2 :(得分:1)

这是使用绑定作为参考使其在Ruby中工作的另一种方法:

def lab(input, bnd)
  eval "#{input} = 90", bnd
end

x = 80
lab("x", binding)

有关详情,请访问:http://onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdoc

答案 3 :(得分:0)

这可以使用真正的传递参考语言。

C#

public void lab(ref string[] input) {
  input = new string[] {"90"};
}

string[] x = {"80"};
lab(x);

PHP

function lab(&$input) {
  $input = array('90');
}

$x = array('80');
lab($x);

C ++

void lab(string *&input) {
  input = new string[1];
  input[0] = "90";
}

string *x = new string[1];
x[0] = "80";
lab(x);

的Perl

sub lab {
  $_[0] = ['90'];
}

$x = ['80'];
lab($x);