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_Immutability - Fatal编程技术网

Ruby 当追溯到最原始的方法时,被破坏(修改)的对象总是接收者吗?

Ruby 当追溯到最原始的方法时,被破坏(修改)的对象总是接收者吗?,ruby,oop,immutability,Ruby,Oop,Immutability,有些方法对接收器具有破坏性。例如,给定一个数组a和一个对象b,将方法array#push应用为a.push(b)修改a,而不是b。我们可以用另一种方法来包装: class Object def into a a.push(self) end end b.into(a) 因此,这次修改的不是接收方b,而是参数a。然而,Object#into在内部调用Array#push,因此当我们跟踪内部过程(在Ruby实现中)时,我们可以说,在这种情况下,最终修改的对象a也是接收者 是否所有销

有些方法对接收器具有破坏性。例如,给定一个数组
a
和一个对象
b
,将方法
array#push
应用为
a.push(b)
修改
a
,而不是
b
。我们可以用另一种方法来包装:

class Object
  def into a
    a.push(self)
  end
end
b.into(a)
因此,这次修改的不是接收方
b
,而是参数
a
。然而,
Object#into
在内部调用
Array#push
,因此当我们跟踪内部过程(在Ruby实现中)时,我们可以说,在这种情况下,最终修改的对象
a
也是接收者

是否所有销毁(修改)案例最终都可追溯到以修改费为接收者的方法


如果是,是什么原因造成的?这是为了C实现,还是遵循面向对象的原则,还是仅仅是巧合?

不一定是这样,但通常是这样。原因是每个对象都要负责处理自己的状态。向一个对象发送消息会使该对象保持不变,但修改另一个对象通常违反该原则


这是一个古老的OO思想。你不需要修改对象,而是要求他们修改自己。

很自然,有些东西会成为破坏性操作的接受者,对吗?我得说,这是OO。在C代码中,它可能看起来像
rb_push(ary1,ary2)
(没有对象,没有接收器,只有函数)在离开接收器时修改参数unchanged@Stefan伟大的这确实是一个例子。