Cri*_*scu 26 ruby parameter-passing pass-by-reference
在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'
Run Code Online (Sandbox Code Playgroud)
顺便说一句.我知道我可以使用:
a = func(a)
Run Code Online (Sandbox Code Playgroud)
jma*_*mah 31
您可以通过显式传入当前绑定来完成此操作:
def func(x, bdg)
eval "#{x} += 1", bdg
end
a = 5
func(:a, binding)
puts a # => 6
Run Code Online (Sandbox Code Playgroud)
Chr*_*ssl 20
Ruby根本不支持"通过引用传递".一切都是对象,对这些对象的引用总是按值传递.实际上,在您的示例中,您将通过值传递Fixnum
对象的引用副本.
您的代码存在的问题是,x += 1
它不会修改传递的Fixnum
Object,而是创建一个全新且独立的对象.
我认为,Java程序员会将Fixnum
对象称为不可变的.
mue*_*san 11
在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
Run Code Online (Sandbox Code Playgroud)
您可以尝试以下技巧:
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'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
22484 次 |
最近记录: |