【问题标题】:pass by reference but reference to data and not to variable [closed]通过引用传递,但引用数据而不是变量[关闭]
【发布时间】:2010-04-14 04:49:00
【问题描述】:

这是伪代码。这在什么编程语言中是可能的?

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

x = ['80']
lab(x)

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

我用 ruby​​ 写了这个,但是在 ruby​​ 中我得到了 80 的最终 x 值 因为 ruby​​ 是通过引用传递的。然而通过的是 引用 x 持有的数据,而不是指向 x 本身的指针 在 JavaScript 中也是如此。所以我想知道有没有 满足以下条件的编程语言。

【问题讨论】:

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


    【解决方案1】:

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

    大多数现代语言(Java、Python、Ruby、Javascript、Go 等)都通过 object-reference(即所谓的“数据引用”)传递(和分配) , 虽然有些更复杂,让您可以更精确地指定您想要的内容(例如,C++、C#)。

    【讨论】:

    • “数据引用”。我第一次听到这个词,但似乎是一个恰当的名字。感谢您的回答。
    【解决方案2】:

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

    def lab input
      input.replace ['90']
    end
    
    x = ['80']
    #=> ["80"]
    lab x
    #=> ["90"]
    x
    #=> ["90"]
    

    【讨论】:

    • 问题不在于传递变量,而是input = ['90'] 将局部变量“输入”重新分配给新的数组对象。 input.replace 更改现有对象的内容,这是您尝试做的。
    • 我不确定我是否理解你;我一开始就说过,不能在 Ruby 的方法中重新分配变量 x,只能改变它的内容。
    【解决方案3】:

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

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

    更多信息请访问:http://onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdoc

    【讨论】:

      【解决方案4】:

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

      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);
      

      【讨论】:

        猜你喜欢
        • 2012-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 2012-02-10
        • 1970-01-01
        • 2013-09-05
        相关资源
        最近更新 更多