Re: [問題] method 要如何將數字 pass by reference
※ 引述《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
01/23 00:41, 1F
→
01/23 00:41, , 2F
01/23 00:41, 2F
→
01/23 06:25, , 3F
01/23 06:25, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 7 篇):
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章