论坛首页 编程语言技术论坛

ruby 函数到底是按值传递还是按引用

浏览 18693 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (3) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-11-09  
rubynroll 写道
在ruby里面对象分两类,对于可以在32 bit(其实没有32bit)中存得下的值,例如Fixnum,nil,true/false等,变量里面是存值的。对于其他对象,变量里面存的是指向对象的“句柄”。
ruby函数调用传递的是“值” - 净值(对于第一类),或句柄。


拜服,老外说了一大堆的,你一句就讲明白了。深表同意。
1 请登录后投票
   发表时间:2011-11-09  
洛克刘 写道

接下来继续看看

 

def pref3(a,b)
a,b = b,a
end

a,b = 1,2
pref3(a,b)
puts a,b #输出 1,2

 

为什么明明在pref3中交换了a,b结果为什么没变呢?这个问题确实比较难懂。我们可以把你的例子转换为一个更好理解的例子

 

变为
def pref3(a)
 a = 5
end

a =1
pref3(a)
puts a #输出 1

 明明把a传进去了,并给它赋值为5,为什么还是1呢?我们很自然的可以想到是不是外面的a和方法中的a不是同一个东西。为了验证,我们进一步改造我们的方法

改造
def pref3(a)
a = 5
a.object_id
end

a =1
a.object_id #输出3

pref3(a) #输出11
puts a

 我们发现两个a的object_id不同,他们不是一个对象,而是两个。

 现在我们明白了问题的关键,方法中的本地变量a指向了对象5,而外部的a仍旧指向的是对象1.

 

 至此整个过程我们可以理解为:

  1.  有一个对象1,我们用a保存了他的引用。
  2.  然后我们将它的“引用的拷贝”传递给了方法pref3中的本地变量a,这时本地变量a保存了1对象的引用。
  3.  我们在pref3方法中创建了5对象,将其引用赋值给了本地变量a,这时a擦去了保存的1对象的引用,而改为保存5对象的引用
  4.  调用完pref3方法 ,其本地变量a随之消亡,对象5因为没有引用而随后被垃圾回收。
  5.  而外部的变量a自始至终保存着对象1的引用。

 

现在回头想想你的方法中传进去的a,b虽然交换了位置,但是对外部定义的a,b没有丝毫影响。因为他们根本保存的就是不同的对象的引用。

 

 

 

 

如果用传值来解释的话,一切都清楚了。。。。

ruby的参数的传递方式与它是否面向对象没有什么关系的

 

 

 

 

 

0 请登录后投票
   发表时间:2011-11-09  
洛克刘 写道
rubynroll 写道
在ruby里面对象分两类,对于可以在32 bit(其实没有32bit)中存得下的值,例如Fixnum,nil,true/false等,变量里面是存值的。对于其他对象,变量里面存的是指向对象的“句柄”。
ruby函数调用传递的是“值” - 净值(对于第一类),或句柄。


拜服,老外说了一大堆的,你一句就讲明白了。深表同意。



同感~~
0 请登录后投票
   发表时间:2011-11-09  
这是不是说明ruby最好是对象的方法或者类的方法,不要用单独的独立函数。
0 请登录后投票
   发表时间:2011-11-10  
adventurelw 写道
这是不是说明ruby最好是对象的方法或者类的方法,不要用单独的独立函数。


ruby中没有所谓的“单独的独立函数”,你自己定义的看似在所有类之外的函数,其实属于Kernel的Scope.


$ irb
irb(main):001:0> def aaaa
irb(main):002:1> end
=> nil
irb(main):005:0> Kernel.methods.sort.join(" ")
=> "< <= <=> == === =~ > >= Array Float Integer String __id__ __method__ __send__ ` aaaa abort ancestors ..."

0 请登录后投票
   发表时间:2011-11-14  
什么经过了pref1方法a1的值发生了变化
0 请登录后投票
   发表时间:2011-11-15  
刚开始学习ruby,学习下,
0 请登录后投票
   发表时间:2011-11-16  
ruby里,最复杂的地方是这里吧???

  • 大小: 11.3 KB
0 请登录后投票
   发表时间:2011-11-16  
gu_sofia 写道
什么经过了pref1方法a1的值发生了变化



因使用了!重磅方法

downcase! 会直接修改并返回原对象
0 请登录后投票
   发表时间:2011-11-16   最后修改:2011-11-16

[quote=&quot;sevk&quot;]ruby里,最复杂的地方是这里吧???




 


i1 = T1.new


puts "i1.get_v1: #{i1.get_v1}" #输出 bbb in init


puts "T1.get_v1: #{T1.get_v1}" #输出 ! aaa !


puts "i1.v1: #{i1.v1}" #输出 bbb in init


puts "i1.get2: #{i1.get2}" #输出   ! @@ v2 !


puts "i1.get3: #{i1.get3}" #输出 @@ v3 in init


puts "i1.v3: #{i1.v3}" #输出 这里是空的


puts "i1.vtest: #{i1.vtest}" #输出 vtest


#puts "T1.vtest: #{T1.vtest}" 报错




这里涉及:self知识,类的属性读写控制(@,@@,Symbol)


恩,急等大牛。。。解达呀。。。


(此程式有部分看的懂,但越看越糊~~)

 

  • 大小: 26.1 KB
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics