Re: [問題] method 要如何將數字 pass by reference
我發覺我好像講得太複雜了些,如果你看不太懂的話,
可以暫時不要管這些細節和名詞,知道會有怎麼樣的結果就好了。
會分這些差別的原因是我是寫 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
01/23 16:03, 1F
推
01/23 16:11, , 2F
01/23 16:11, 2F
→
01/23 19:20, , 3F
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
01/24 00:03, 6F
→
01/24 20:09, , 7F
01/24 20:09, 7F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 7 篇):
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章