当前位置:  开发笔记 > 编程语言 > 正文

Ruby中的'通过引用传递参数'?

如何解决《Ruby中的'通过引用传递参数'?》经验,为你挑选了4个好方法。

在Ruby中,是否可以通过引用传递带有值类型语义的参数(例如Fixnum)?我正在寻找类似于C#的' ref '关键字的东西.

例:

def func(x) 
    x += 1
end

a = 5
func(a)  #this should be something like func(ref a)
puts a   #should read '6'

顺便说一句.我知道我可以使用:

a = func(a)

jmah.. 31

您可以通过显式传入当前绑定来完成此操作:

def func(x, bdg)
  eval "#{x} += 1", bdg
end

a = 5
func(:a, binding)
puts a # => 6


Christoph Sc.. 20

Ruby根本不支持"通过引用传递".一切都是对象,对这些对象的引用总是按值传递.实际上,在您的示例中,您将通过值传递Fixnum对象的引用副本.

您的代码存在的问题是,x += 1它不会修改传递的FixnumObject,而是创建一个全新且独立的对象.

我认为,Java程序员会将Fixnum对象称为不可变的.



1> jmah..:

您可以通过显式传入当前绑定来完成此操作:

def func(x, bdg)
  eval "#{x} += 1", bdg
end

a = 5
func(:a, binding)
puts a # => 6



2> Christoph Sc..:

Ruby根本不支持"通过引用传递".一切都是对象,对这些对象的引用总是按值传递.实际上,在您的示例中,您将通过值传递Fixnum对象的引用副本.

您的代码存在的问题是,x += 1它不会修改传递的FixnumObject,而是创建一个全新且独立的对象.

我认为,Java程序员会将Fixnum对象称为不可变的.


你是对的,我正在阅读Christoph的回答和我的评论,我不同意我的2009年自我.嗯...
当变量和参数只能包含对象的引用时,我不会得到Ruby不通过ref传递的东西.说通过值传递引用与通过引用传递对象相同.
@Damien:不,不是.通过引用传递(例如,在C++,C#,PHP,Perl中)允许您*将*赋值给变量,就像在外部范围中分配给它一样.你真正想通过引用来做这件事是可能的.但不是通过引用的值.

3> muesan..:

在Ruby中,您无法通过引用传递参数.对于您的示例,您必须返回新值并将其分配给变量a或创建包含该值的新类并传递此类的实例.例:

class Container
attr_accessor :value
 def initialize value
   @value = value
 end
end

def func(x)
  x.value += 1
end

a = Container.new(5)
func(a)
puts a.value



4> Ivan Gusev..:

您可以尝试以下技巧:

def func(x) 
    x[0] += 1
end

a = [5]
func(a)  #this should be something like func(ref a)
puts a[0]   #should read '6'

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有