第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Ruby是按引用傳遞還是按值傳遞?

Ruby是按引用傳遞還是按值傳遞?

溫溫醬 2019-06-06 13:49:55
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對(duì)象將錯(cuò)誤添加到lang_errors變量中的update_lanugages方法。當(dāng)我對(duì)@user對(duì)象丟失最初存儲(chǔ)在lang_errors變量。雖然我試圖做的更多的是一次黑客攻擊(這似乎不起作用)。我想了解為什么變量值會(huì)被淘汰。我理解引用傳遞,所以我想知道如何在不被淘汰的情況下將值保存在變量中。
查看完整描述

3 回答

?
慕容708150

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊

在傳統(tǒng)術(shù)語(yǔ)中,Ruby嚴(yán)格按值傳遞。..但這不是你想要的。

Ruby沒有任何純、非引用值的概念,因此您當(dāng)然不能將其傳遞給方法。變量總是引用對(duì)象。為了獲得一個(gè)不會(huì)在您下面更改的對(duì)象,您需要使用DUP或克隆所傳遞的對(duì)象,從而給出一個(gè)沒有其他人引用的對(duì)象。(盡管如此,這并不是防彈的-這兩種標(biāo)準(zhǔn)的克隆方法都是淺拷貝的,因此克隆的實(shí)例變量仍然指向與原始對(duì)象相同的對(duì)象。如果象牙引用的對(duì)象發(fā)生了變異,那么它仍然會(huì)出現(xiàn)在副本中,因?yàn)樗玫氖窍嗤膶?duì)象。)


查看完整回答
反對(duì) 回復(fù) 2019-06-06
?
蝴蝶刀刀

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊

其他答案都是正確的,但一位朋友要求我向他解釋這一點(diǎn),其實(shí)質(zhì)在于Ruby是如何處理變量的,因此我想分享一下我為他寫的一些簡(jiǎn)單的圖片/解釋(為篇幅而道歉,可能有些過(guò)于簡(jiǎn)單化):


Q1:當(dāng)你給一個(gè)新變量賦值時(shí)會(huì)發(fā)生什么?str值為.'foo'?

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

enter image description here

A:一個(gè)叫做str創(chuàng)建指向?qū)ο蟮?/trans>'foo',對(duì)于這個(gè)Ruby解釋器的狀態(tài),它恰好位于內(nèi)存位置。2000.


Q2:賦值現(xiàn)有變量時(shí)會(huì)發(fā)生什么?str使用=?

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


A:標(biāo)簽str現(xiàn)在指向另一個(gè)對(duì)象。


Q3:當(dāng)你給一個(gè)新變量賦值時(shí)會(huì)發(fā)生什么?=str?

str2 = str
str2.object_id # => 2002


A:一個(gè)新的標(biāo)簽叫做str2創(chuàng)建,指向同一對(duì)象str.


Q4:如果被strstr2變了?

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


答:兩個(gè)標(biāo)簽仍然指向同一個(gè)對(duì)象,但該對(duì)象本身發(fā)生了變異(其內(nèi)容已更改為其他內(nèi)容)。


這與原來(lái)的問題有何關(guān)系?

這與Q3/Q4中的情況基本相同;該方法獲得變量/標(biāo)簽的私有副本(str2)傳遞給它(str)。它不能更改標(biāo)簽的對(duì)象str 指點(diǎn),但它可以更改.的內(nèi)容它們都引用以包含Other的對(duì)象:

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


查看完整回答
反對(duì) 回復(fù) 2019-06-06
?
白衣染霜花

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊

Ruby是按引用傳遞還是按值傳遞?

Ruby是按值傳遞的。一直都是。沒有例外。如果沒有。沒有但是。

下面是一個(gè)簡(jiǎn)單的程序,它演示了這一事實(shí):

def foo(bar)
  bar = 'reference'endbaz = 'value'foo(baz)puts "Ruby is pass-by-#{baz}"# Ruby is pass-by-value


查看完整回答
反對(duì) 回復(fù) 2019-06-06
  • 3 回答
  • 0 關(guān)注
  • 540 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)