锁定老帖子 主题:ruby 函数到底是按值传递还是按引用
精华帖 (0) :: 良好帖 (1) :: 新手帖 (3) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-11-09
rubynroll 写道 在ruby里面对象分两类,对于可以在32 bit(其实没有32bit)中存得下的值,例如Fixnum,nil,true/false等,变量里面是存值的。对于其他对象,变量里面存的是指向对象的“句柄”。
ruby函数调用传递的是“值” - 净值(对于第一类),或句柄。 拜服,老外说了一大堆的,你一句就讲明白了。深表同意。 |
|
返回顶楼 | |
发表时间: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.
至此整个过程我们可以理解为:
现在回头想想你的方法中传进去的a,b虽然交换了位置,但是对外部定义的a,b没有丝毫影响。因为他们根本保存的就是不同的对象的引用。
如果用传值来解释的话,一切都清楚了。。。。 ruby的参数的传递方式与它是否面向对象没有什么关系的
|
|
返回顶楼 | |
发表时间:2011-11-09
洛克刘 写道 rubynroll 写道 在ruby里面对象分两类,对于可以在32 bit(其实没有32bit)中存得下的值,例如Fixnum,nil,true/false等,变量里面是存值的。对于其他对象,变量里面存的是指向对象的“句柄”。
ruby函数调用传递的是“值” - 净值(对于第一类),或句柄。 拜服,老外说了一大堆的,你一句就讲明白了。深表同意。 同感~~ |
|
返回顶楼 | |
发表时间:2011-11-09
这是不是说明ruby最好是对象的方法或者类的方法,不要用单独的独立函数。
|
|
返回顶楼 | |
发表时间: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 ..." |
|
返回顶楼 | |
发表时间:2011-11-14
什么经过了pref1方法a1的值发生了变化
|
|
返回顶楼 | |
发表时间:2011-11-15
刚开始学习ruby,学习下,
|
|
返回顶楼 | |
发表时间:2011-11-16
ruby里,最复杂的地方是这里吧???
|
|
返回顶楼 | |
发表时间:2011-11-16
gu_sofia 写道 什么经过了pref1方法a1的值发生了变化
因使用了!重磅方法 downcase! 会直接修改并返回原对象。 |
|
返回顶楼 | |
发表时间:2011-11-16
最后修改:2011-11-16
[quote="sevk"]ruby里,最复杂的地方是这里吧???
|
|
返回顶楼 | |