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

看板Ruby作者 (godfat 真常)時間17年前 (2008/01/22 20:06), 編輯推噓0(003)
留言3則, 2人參與, 最新討論串2/7 (看更多)
※ 引述《dendrobium (石斛蘭)》之銘言: : 環境: : ruby 1.8.4 (2006-04-14) [i386-mswin32] : 附錄: : 以物件來說 好像都是用pass by reference : 但是如果是數字 就會變成pass by value ? : 請問有方法可以改成pass by reference嗎? 事實上,應該說 ruby 並沒有 call by reference, 這個狀況跟 java 是一模一樣的,也就是 no variable alias. class C; end; def f c c = C.new end c = C.new # => #<C:0x2ac27629a140> f c # => #<C:0x2ac27628ee08> c # => #<C:0x2ac27629a140> 沒有任何方法可以去 refer 一個 variable, 而在你的例子裡,wei 是一個 variable, refer 一個 Fixnum, 你沒有辦法透過 function 去改變 wei 所 refer 的對象。 也就是說,所有的 variable 都是 call by value 的。 這也是為什麼我寫了一個 variable 的 wrapper, 想做 variable alias, 也就是讓 swap 之類的東西本身也能模組化: def swap a, b a, b = b, a end a, b = C.new, C.new swap a, b # 這行完全沒有意義。 以下是從我的 test case 中取出來的: require File.join(File.dirname(__FILE__), '..', 'lib', 'ludy/test/helper') require 'ludy/variable' class TestVariable < Test::Unit::TestCase include Ludy class Qoo def cool 'cool ~~~~' end end def swap a, b # 這樣定義 swap 就能夠有意義 a.__obj__, b.__obj__ = b.__obj__, a.__obj__ end def test_swap a, b = var(1), var(2) # 這等同於 Variable.new 1 等,只是懶人 wrapper. swap a, b assert_equal 2, a assert_equal 1, b end def test_variable # 這是我原本的 test case, 上面那是寫這篇時追加的 XD x = var Qoo.new y = x assert_equal x.__obj__, y.__obj__ assert_equal Qoo, x.__obj__.class assert_equal Qoo, x.class assert_equal 'cool ~~~~', x.cool assert_equal 'cool ~~~~', y.cool x.__obj__ = nil assert x.nil? assert y.nil? end end 想玩玩看的話,請 gem install ludy, 不過你的 ruby 版本不是最新的,我不確定會不會有問題, 我只在 ruby 1.8.5, 1.8.6, 1.9.0, 1.9.0 svn 這幾個版本試過而已 或是現在有 rdoc 了: http://ludy.rubyforge.org/classes/Ludy/Variable.html svn: http://ludy.rubyforge.org/svn/lib/ludy/variable.rb -- By Gamers, For Gamers - from the past Interplay -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.28.18

01/23 00:41, , 1F
thx 不過我才剛學 要消化一下@@
01/23 00:41, 1F

01/23 00:41, , 2F
現在最新的穩定版本是 1.8.6 嗎?
01/23 00:41, 2F

01/23 06:25, , 3F
呵。對,是 1.8.6
01/23 06:25, 3F
文章代碼(AID): #17bTn4dD (Ruby)
討論串 (同標題文章)
文章代碼(AID): #17bTn4dD (Ruby)