Re: [問題] method 要如何將數字 pass by reference

看板Ruby作者 (godfat 真常)時間17年前 (2008/01/23 12:48), 編輯推噓4(403)
留言7則, 3人參與, 最新討論串4/7 (看更多)
我發覺我好像講得太複雜了些,如果你看不太懂的話, 可以暫時不要管這些細節和名詞,知道會有怎麼樣的結果就好了。 會分這些差別的原因是我是寫 C++ 出身的,C++ 物件約略可以分為兩種, 一種是放在 stack(auto object)另一種放在 free space. 如果你寫過 C++ 的話,ruby/java 的 variable 可以看成 C++ 的 pointer, 他是拿來 point/refer 某個 instance, 但本身不是 instance. ※ 引述《dendrobium (石斛蘭)》之銘言: : 那再借問一下 : 如果都是pass by value 所謂 pass/call by value, 是指 variable 的傳遞, 在這裡必須先釐清一下何謂 variable. 在 ruby/java 中,variable 是一個 refer 某個 instance 的東西, 所謂 instance 可以看成存在 ObjectSpace 中,不會被清除的東西。 (這邊先不考慮 gc 的問題) 所有透過 new, allocate 等產生出來的東西,都會是 instance. 同時這也包括一些 constant, 例如 number literal (Fixnum). 而 variable 本身並不是 instance, 你可以把他想像他是放在 stack 裡的, 當他離開他本身所屬的 scope 後,也就是該 function return 掉的時候, variable 會被清除掉。反之,instance 絕不會。 請看下例: : 為什麼下面的寫法 : a會被清空呢@@? : #---------------------- : def f a ^ 這個,是 (一) 的 variable 本身的 copy : a.clear ^ 當你對某個 variable send message 時, 其實你不是在操作 variable 本身,而是操作 其 variable 所 refer 的 instance. 所以你是叫那個 instance 進行 clear 這個動作。 : end : a = Array.new : a<<1 : p a #=> [1] : f(a) ^(一) 在你的這段程式裡,總共有兩個 variable, 兩個都叫 a, 一個是這裡的 a, 另一個是 f 中的 a. 同時,他們都 refer 到同一個 instance, 也就是你上面 Array.new 的那個。 你的 variable 是被 copy 過去的,但是他們同時 refer 到 同一個 instance, 而你 send message 的操作,是操作 instance, 所以不管你從哪個 variable 去作操作,都影響到同一個 instance. : p a #=> [] : #---------------------- 假使你的 f 是寫成這樣: def f a a = [] end 而不是 def f a a.clear end 的話,那麼 a 就不會被清空了。因為 = 是對 variable 操作,而不是 instance. 要讓 = 能有效果的話,就必須有 variable alias, 也就是 call by reference. 在 C++ 裡,是有這樣的東西。C 沒有喔。C 只能用 pointer 模擬。 Ruby 的話,就像我上篇提到的那樣,可以勉強模擬出來。 btw, 回到你原本的問題,如果可以這樣寫的話: def ch(a) a.replace a*R end 由於對 a 是 send message, 所以是操作 instance, 這樣就能影響到外界了。 不過因為 Fixnum 是 constant, 所以不可能提供這種東西給你。 不然很恐怖的是,以後你說 1 其實可能真正是在指 2... 1.replace 2 1.to_s # => "2" 所以不再多包一層是不行的。 -- Hear me exalted spirits. Hear me, be you gods or devils, ye who hold dominion here: I am a wizard without a home. I am a wonderer seeking refuge. Sacrifice -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.28.18

01/23 16:03, , 1F
ok thx, 我再研究一下
01/23 16:03, 1F

01/23 16:11, , 2F
我大概了解了 不過replace是你虛構的method嗎?
01/23 16:11, 2F

01/23 19:20, , 3F
array 有,fixnum 沒有
01/23 19:20, 3F

01/23 19:28, , 4F
謝謝解答
01/23 19:28, 4F

01/24 00:03, , 5F
還是好複雜 @@ 我後來講這個都習慣用畫圖的
01/24 00:03, 5F

01/24 00:03, , 6F
可是BBS不好畫圖..
01/24 00:03, 6F

01/24 20:09, , 7F
我本來也是想畫圖,只是兩秒後就放棄了 XDD
01/24 20:09, 7F
文章代碼(AID): #17biS2M- (Ruby)
討論串 (同標題文章)
文章代碼(AID): #17biS2M- (Ruby)