Ruby 按引用传递,但引用数据而不是变量

Ruby 按引用传递,但引用数据而不是变量,ruby,language-agnostic,pass-by-reference,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 因为ruby是通过引用传递的。然而,通过的是 引用x所持有的数据,而不是指向x本身的指针 JavaScript也是如此。所以我想知道是否有 符合以下条件

这是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 因为ruby是通过引用传递的。然而,通过的是 引用x所持有的数据,而不是指向x本身的指针 JavaScript也是如此。所以我想知道是否有
符合以下条件的编程语言。

有几种语言支持按引用传递:它在大多数Fortran版本中的隐含时间比大多数其他编程语言都长(有些版本使用来回拷贝,但最终结果最好相同;-),它是在70年代由Pascal中的
var
指定的(尽管默认情况下,如果你没有说
var
,它是通过复制指定的),等等


大多数现代语言(java、python、Ruby、JavaScript、Go、…)通过对象引用(即所谓的“引用数据”)均匀传递(和赋值),尽管有些更复杂,并且让你更精确地指定你想要的(例如C++,C)。.

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


大多数现代语言(java、python、Ruby、JavaScript、Go、…)通过对象引用(即所谓的“引用数据”)均匀传递(和赋值),尽管有些更复杂,并且让你更精确地指定你想要的(例如C++,C)。因此,在Ruby中,您不能使

x
引用方法中的另一个对象,但您可以更改对象本身,在您的情况下,可以使用变异方法实现您想要的(例如,在数组的情况下可能很方便):


因此,在Ruby中,您不能让
x
引用方法中的另一个对象,但您可以更改对象本身,在您的情况下,可以使用变异方法实现您想要的(例如,在数组中可能很方便):


这在具有真正按引用传递的语言中是可能的

C#

PHP

C++

Perl


这在具有真正按引用传递的语言中是可能的

C#

PHP

C++

Perl


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

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

x = 80
lab("x", binding)

更多信息请访问:

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

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

x = 80
lab("x", binding)

更多信息请访问:

“引用数据”。我第一次听到这个术语,但它似乎是一个恰当的名称。谢谢你的回答。“引用数据”。我第一次听到这个术语,但它似乎是一个恰当的名称。谢谢你的回答。重点是你的问题不在于传递变量,而是
输入=['90']
将局部变量“input”重新分配给一个新的数组对象。
input.replace
更改现有对象的内容,这正是您试图做的。我不确定我是否理解您的意思;我在一开始就说过,不能从Ruby中的方法中重新分配变量
x
,只需改变它的内容。重点是因为您的问题不是传递变量,而是
input=['90']
将局部变量“input”重新分配给一个新的数组对象。
input.replace
更改现有对象的内容,这正是您试图做的。我不确定我是否理解您的意思;我在一开始就说过,不能从Ruby中的方法中重新分配变量
x
,只需改变其内容即可。
function lab(&$input) {
  $input = array('90');
}

$x = array('80');
lab($x);
void lab(string *&input) {
  input = new string[1];
  input[0] = "90";
}

string *x = new string[1];
x[0] = "80";
lab(x);
sub lab {
  $_[0] = ['90'];
}

$x = ['80'];
lab($x);
def lab(input, bnd)
  eval "#{input} = 90", bnd
end

x = 80
lab("x", binding)