Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby中传递对象时会发生什么?_Ruby_Oop_Proc - Fatal编程技术网

在ruby中传递对象时会发生什么?

在ruby中传递对象时会发生什么?,ruby,oop,proc,Ruby,Oop,Proc,假设您有以下类: class Klass include SomeModule def some_method SomeModule::some_proc.call(self) end end 这里到底发生了什么?ruby是否将“self”引用的Klass实例的整个副本加载到内存中,并将该副本传递到“some_method”调用的进程中?或者实例只有一个副本加载到内存中 只有一个实例加载到内存中,Ruby会将指向它的引用/指针传递给您正在调用的进程 与其他一些语言不同,Ru

假设您有以下类:

class Klass
  include SomeModule
  def some_method
    SomeModule::some_proc.call(self)
  end
end

这里到底发生了什么?ruby是否将“self”引用的Klass实例的整个副本加载到内存中,并将该副本传递到“some_method”调用的进程中?或者实例只有一个副本加载到内存中

只有一个实例加载到内存中,Ruby会将指向它的引用/指针传递给您正在调用的进程


与其他一些语言不同,Ruby从不自动复制对象。通常传递对一个对象的引用。通过对每个对象调用
object\u id
(或
inspect
)并确保id相同,可以验证两个对象是否具有相同的标识。您可以通过调用对象上的
dup
clone
来显式复制

“Ruby从来不会自动复制对象”——至少对于MRI来说,这并不完全正确。字符串用作散列键时会被复制,虽然“真正的Ruby对象”,但fixNum(以及其他一些实例,如
true
)不会通过引用传递。@DMKE:Ruby中没有任何东西是通过引用传递的,所以您的最后一句话至少是多余的,最糟糕的是会产生误导,因为它可以理解为意味着不是
Fixnum
s或
true
的对象是通过引用传递的;如果没有任何内容是通过引用传递的,那么它是如何传递的?像Fixnums这样的对象和自定义对象之间有区别吗?为了不同意Jorg的观点,我想说在Ruby中所有的东西都是通过引用传递的,但我不想在引用和指针之间做任何区分。如果您谈论的是一个普通的旧Ruby对象(即
Klass
)的实例,那么Ruby会跟踪指向该对象内存的32位(或64位机器的64位)指针,而这个指针就是传递的。修饰符、符号、nil、false和true的行为类似于通过引用传递的不可变对象,但为了提高效率,它们实际上不使用指向内存位置的指针,但这是一个实现细节。通过研究如何编写C扩展,我了解了很多Ruby的工作原理: