注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

关于Ruby 方法是按值传递还是按引用传递  

2011-11-09 11:23:00|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

谨记一点在Ruby中“一切皆对象”

相关例子

def pref1(agr)   
   agr.downcase!
end
a1 = 'HELLO'
pref1(a1)
puts "#{a1}" #输出 hello

def pref2(agr)
    agr.downcase
end
a2 = 'PREF2'
pref2(a2)
puts "#{a2}" #输出 PREF2

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


def pref4(agr)
    agr.replace('aaaaa')
end
a4 = 'a'
pref4(a4)
puts a4 #输出 aaaa

 

例子解释

    说明:在ruby中一切都是对象,而你向方法中传递的实质上是对象的引用( object-reference)。ruby中变量都是对象的引用。

   1 pref1 方法与pref2方法区别在于:downcase 方法返回的都是原字符串的一个拷贝。但是 downcase!重磅方法,都是直接修改并返回原对象。像这类方法还有:upcase, swapcase和 capitalize。

   2  pref3方法:

              我们可以把例子转换为一个更好理解的例子

变为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没有丝毫影响。因为他们根本保存的就是不同的对象的引用。

相关参考

    1 以上例子解释:来源于 @洛克刘 ,详情地址:http://www.iteye.com/topic/1117575

    2 在ruby-forum BBS上也有相关讨论,详情地址:http://www.ruby-forum.com/topic/41160

  评论这张
 
阅读(442)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017