Ruby是按引用传递还是按值传递?

@user.update_languages(参数[:language][:language1],
参数[:语言][:语言2],
参数[:语言][:语言3])
[email protected]
logger.debug“--------------LANG\u错误----------101----------------”
+语言错误。完整消息。检查
如果参数[:用户]
@user.state=params[:user][:state]
成功=成功&[email protected]
终止
logger.debug“--------------LANG\u错误------------------102--------”
+语言错误。完整消息。检查
如果lang\u错误。完整消息。空?

@user对象将错误添加到update\u lanugages方法中的lang\u errors变量中。
当我对@user对象执行保存时,我丢失了最初存储在langu errors变量中的错误

虽然我试图做的更多的是一个黑客(这似乎不起作用)。我想了解为什么变量值被洗掉了。我理解passbyreference,所以我想知道如何将值保存在该变量中而不被冲掉

其他回答都是正确的,但一位朋友让我向他解释这一点,而这实际上归结为Ruby是如何处理变量的,因此我想与他分享一些我为他写的简单图片/解释(抱歉篇幅太长,可能有些过于简单):


问题1:将新变量str赋值为'foo'时会发生什么情况

str='foo'
str.object_id#=>2000

答:创建了一个名为str的标签,该标签指向对象'foo',在这个Ruby解释器的状态下,该对象恰好位于内存位置2000


问题2:使用=将现有变量str分配给新对象时会发生什么情况

str='bar'。点击{b |放置“bar:{b.object_id}}}bar:2002
str.object_id#=>2002

答:标签str现在指向另一个对象


问题3:将新变量=分配给str时会发生什么情况

str2=str
str2.object_id#=>2002

答:创建了一个名为str2的新标签,该标签指向与str相同的对象


问题4:如果strstr2引用的对象发生更改,会发生什么情况

str2.替换“baz”
str2#=>'巴兹
str#=>'巴兹
str.object_id#=>2002
str2.object_id#=>2002

答:两个标签仍然指向同一个对象,但该对象本身发生了变化(其内容已更改为其他内容)


这与原来的问题有什么关系

与第三季度/第四季度的情况基本相同;该方法获取传入它的变量/标签(str2)的私有副本(str)。它不能更改标签str指向的对象,但它可以更改它们都引用的对象的内容以包含其他内容:

str='foo'
def突变(str2)
放置“str2:#{str2.object_id}”
str2.替换“bar”
str2=‘baz’
放置“str2:#{str2.object_id}”
终止
str.object_id#=>2004
突变(str)#str2:2004,str2:2006
str#=>“酒吧”
str.object_id#=>2004

发表评论