【问题标题】:What memory is created/referenced when when an object is passed to a method? [duplicate]将对象传递给方法时会创建/引用什么内存? [复制]
【发布时间】:2012-09-01 15:22:53
【问题描述】:

可能重复:
Is Ruby pass by reference or by value?

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

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

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

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

  3. 其他我想不出来的东西...可能类似于Go...的内存模型...管道...消息传递...?

实际发生了什么?

【问题讨论】:

    标签: ruby memory-management


    【解决方案1】:

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

    【讨论】:

    • 你能给我指出一些描述这个的文档吗?
    • 变量总是存储引用...
    • 哦,天哪,我们需要重新考虑一下吗? Ruby 通过引用传递。绝不。没有如果,没有但是,没有极端情况,没有例外。它总是按值传递。总是。在这方面,它的行为就像 Java、Smalltalk、Python、C、C#(默认)、C++(默认)以及几乎所有其他面向对象或过程语言。
    【解决方案2】:

    Ruby 使用按值传递,或者更准确地说,是按值传递的一种特殊情况,其中传递的值始终 是一个指针。这种特殊情况有时也称为 call-by-sharing、call-by-object-sharing 或 call-by-object。

    这与曾经创建的每一种面向对象语言或多或少都使用相同的约定。

    注意:在所有现有的 Ruby 实现中,Symbols、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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-24
      • 2014-05-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 2022-10-12
      相关资源
      最近更新 更多