gpt4 book ai didi

ruby-on-rails - Ruby 是按引用传递还是按值传递?

转载 作者:数据小太阳 更新时间:2023-10-29 06:16:28 25 4
gpt4 key购买 nike

@user.update_languages(params[:language][:language1], 
params[:language][:language2],
params[:language][:language3])
lang_errors = @user.errors
logger.debug "--------------------LANG_ERRORS----------101-------------"
+ lang_errors.full_messages.inspect

if params[:user]
@user.state = params[:user][:state]
success = success & @user.save
end
logger.debug "--------------------LANG_ERRORS-------------102----------"
+ lang_errors.full_messages.inspect

if lang_errors.full_messages.empty?

@user 对象将错误添加到 update_lanugages 方法中的 lang_errors 变量。当我对 @user 对象执行保存时,我丢失了最初存储在 lang_errors 变量中的错误。

虽然我正在尝试做的更像是一种 hack(这似乎不起作用)。我想了解为什么变量值被冲掉了。我了解通过引用传递,所以我想知道如何将值保存在该变量中而不被冲掉。

最佳答案

其他回答者都是正确的,但是一个 friend 让我向他解释这个,真正归结为Ruby如何处理变量,所以我想我会分享一些我为他写的简单图片/解释(道歉对于长度和可能的一些过度简化):


问题 1:当您将新变量 str 赋值给 'foo' 时会发生什么?

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

enter image description here

A:创建了一个名为 str 的标签,它指向对象 'foo',对于这个 Ruby 解释器的状态来说,它恰好位于内存位置 2000.


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

str = 'bar'.tap{|b| puts "bar: #{b.object_id}"} # bar: 2002
str.object_id # => 2002

enter image description here

答:标签 str 现在指向一个不同的对象。


问题 3:当您将新变量 = 分配给 str 时会发生什么?

str2 = str
str2.object_id # => 2002

enter image description here

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


Q4:如果strstr2引用的对象发生变化会怎样?

str2.replace 'baz'
str2 # => 'baz'
str # => 'baz'
str.object_id # => 2002
str2.object_id # => 2002

enter image description here

A:两个标签仍然指向同一个对象,但是那个对象本身已经发生了变异(它的内容已经变成了别的东西)。


这与原始问题有什么关系?

与Q3/Q4基本相同;该方法获取传递给它 (str) 的变量/标签 (str2) 的私有(private)副本。它不能改变标签str指向的对象,但它可以改变它们都引用的对象的内容包含else :

str = 'foo'

def mutate(str2)
puts "str2: #{str2.object_id}"
str2.replace 'bar'
str2 = 'baz'
puts "str2: #{str2.object_id}"
end

str.object_id # => 2004
mutate(str) # str2: 2004, str2: 2006
str # => "bar"
str.object_id # => 2004

关于ruby-on-rails - Ruby 是按引用传递还是按值传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1872110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com