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 # => 2002
A:标签 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
答:两个标签仍然指向同一个对象,但该对象本身发生了变异(其内容已更改为其他内容)。
这与原来的问题有何关系?
str2
str
str
指点
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 关注
- 501 浏览
添加回答
举报
0/150
提交
取消