作者godfat (godfat 真常)
看板Ruby
标题Re: [问题] method 要如何将数字 pass by reference
时间Tue Jan 22 20:06:26 2008
※ 引述《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
1F:→ dendrobium:thx 不过我才刚学 要消化一下@@ 01/23 00:41
2F:→ dendrobium:现在最新的稳定版本是 1.8.6 吗? 01/23 00:41
3F:→ godfat:呵。对,是 1.8.6 01/23 06:25