0

可能重复:
Ruby 是按引用传递还是按值传递?

使用 Ruby,将对象传递给方法时,该对象的内存是如何处理的?

来自 C 背景,我可以想到可能发生的几件事:

  1. 与相应对象关联的内存副本,可供被调用的方法使用。在这种情况下,对象的修改只会反映在被调用方法的上下文中,而不是调用方法。

  2. 对对象内存的引用被传递给被调用的方法(本质上是一个指针)。因此,对象通过被调用的方法或调用方法所做的任何更改都将反映在两个上下文中。同样,如果该程序是多线程的,则必须使用某种机制(互斥量、信号量等)来确保对执行写入操作的内存的互斥访问。

  3. 还有一些我想不出来的东西……也许是类似于Go的内存模型……管道……消息传递……?

实际发生了什么?

4

2 回答 2

2

Ruby 使用您的第二个选项,通过引用传递参数。

于 2012-09-07T18:19:22.387 回答
2

Ruby 使用按值传递,或者更准确地说,是按值传递的一种特殊情况,其中传递的值始终是一个指针。这种特殊情况有时也称为共享调用、对象共享调用或对象调用。

几乎所有创建的面向对象语言都使用相同的约定。

注意:在所有现有的 Ruby 实现Symbol中,Fixnums 和Floats 实际上是直接按值传递的,而不是使用中间指针。但是,由于这三个是不可变的,在这种情况下,按值传递和按对象调用共享之间没有可观察到的行为差异,因此您可以通过简单地将所有内容视为按对象调用来大大简化您的思维模型-分享。只需将这三种特殊情况解释为您无需担心的内部编译器优化即可。

这是一个简单的示例,您可以运行它来确定 Ruby(或任何其他语言,在您翻译后)的参数传递约定:

def is_ruby_pass_by_value?(foo)
  foo.replace('More precisely, it is call-by-object-sharing!')
  foo = 'No, Ruby is pass-by-reference.'
  return nil
end

bar = 'Yes, of course, Ruby *is* pass-by-value!'

is_ruby_pass_by_value?(bar)

p bar
# 'More precisely, it is call-by-object-sharing!'

简而言之:这是您的选择 2。

于 2012-09-07T23:38:41.703 回答