Ruby是按引用传递还是按值传递?@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.inspectif params[:user]
@user.state = params[:user][:state]
success = success & @user.saveendlogger.debug "--------------------LANG_ERRORS-------------102----------"
+ lang_errors.full_messages.inspectif lang_errors.full_messages.empty?@user对象将错误添加到lang_errors变量中的update_lanugages方法。当我对@user对象丢失最初存储在lang_errors变量。虽然我试图做的更多的是一次黑客攻击(这似乎不起作用)。我想了解为什么变量值会被淘汰。我理解引用传递,所以我想知道如何在不被淘汰的情况下将值保存在变量中。
3 回答
慕容708150
TA贡献1831条经验 获得超4个赞
蝴蝶刀刀
TA贡献1801条经验 获得超8个赞
Q1:当你给一个新变量赋值时会发生什么? str值为. 'foo'?
str = 'foo'str.object_id # => 2000

A:一个叫做 str创建指向对象的 'foo',对于这个Ruby解释器的状态,它恰好位于内存位置。 2000.
Q2:赋值现有变量时会发生什么? str使用 =?
str = 'bar'.tap{|b| puts "bar: #{b.object_id}"} # bar: 2002str.object_id # => 2002A:标签 str现在指向另一个对象。
Q3:当你给一个新变量赋值时会发生什么? =到 str?
str2 = str str2.object_id # => 2002
A:一个新的标签叫做 str2创建,指向 同一对象如 str.
Q4:如果被 str和 str2变了?
str2.replace 'baz'str2 # => 'baz'str # => 'baz'str.object_id # => 2002str2.object_id # => 2002
答:两个标签仍然指向同一个对象,但该对象本身发生了变异(其内容已更改为其他内容)。
这与原来的问题有何关系?
str2strstr 指点
str = 'foo'def mutate(str2)
puts "str2: #{str2.object_id}"
str2.replace 'bar'
str2 = 'baz'
puts "str2: #{str2.object_id}"endstr.object_id # => 2004mutate(str) # str2: 2004, str2: 2006str # => "bar"str.object_id # => 2004
白衣染霜花
TA贡献1796条经验 获得超10个赞
Ruby是按引用传递还是按值传递?
def foo(bar)
bar = 'reference'endbaz = 'value'foo(baz)puts "Ruby is pass-by-#{baz}"# Ruby is pass-by-value- 3 回答
- 0 关注
- 546 浏览
添加回答
举报
0/150
提交
取消
