ruby中变量都是目标的援。ruby中变量都是目标的援。

ruby中变量都是对象的引用,ruby中变量都是对象的引用

以ruby中一切都是对象,而若于方吃传递的实质上是目标的援(
object-reference)。ruby中变量都是目标的援。

于ruby中一切都是对象,而而往方被传送的本来面目上是目标的援(
object-reference)。ruby中变量都是目标的援。

先来看

先来看

def pref2(agr)
agr.downcase
end


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


a2 = 'PREF2'
pref2(a2)
puts "#{a2}" #输出 PREF2

何以调用了pref2后
a2还是大写的“PREF2”,看一下downcase的源码就一蹴而就发现问题了。

干什么调用了pref2后
a2还是大写的“PREF2”,看一下downcase的源码就好发现题目了。

链接:https://ruby-doc.org/core-2.4.1/String.html,搜索downcase

链接:https://ruby-doc.org/core-2.4.1/String.html,搜索downcase

 

 

看到str=rb_str_dup(str);
这词其实真相大白了,实际上dwoncase返回的凡一个新的字符串,并无是公本来传进的字符串对象的援了。
于是通过了pref2方法后,a2之价并没起改变。

看到str=rb_str_dup(str);
这句其实真相大白了,实际上dwoncase返回的凡一个新的字符串,并无是你本来传进的字符串对象的援了。
于是通过了pref2方法后,a2之价并无来变动。

 

 

再来看

再来看

def pref1(agr) 
agr.downcase!
end

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

a1 = 'HELLO'
pref1(a1)
puts "#{a1}" #输出 hello

缘何经过了pref1计a1底值发生了变。还是事先来探downcase!的源码

怎么经过了pref1方法a1之价发生了扭转。还是先来瞧downcase!的源码

链接:https://ruby-doc.org/core-2.4.1/String.html,搜索downcase!

链接:https://ruby-doc.org/core-2.4.1/String.html,搜索downcase!

 

 

翻看源码后发觉传入的目标引用自始至终未让更改了,所以最后回到的要么a1的援,所以a1目标的始末以dwoncase!方法吃被改了。

查源码后发觉传入的目标引用自始至终未给更改了,所以最终回的或者a1之援,所以a1目标的内容在dwoncase!方法吃叫改了。

 

 

连下去继续看

通下继续看

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

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

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

胡明明当pref3着交换了a,b结果为什么没有换也?这个问题的确比难以掌握。我们可以拿您的例证转换为一个再次好理解的事例

缘何明明在pref3遭受交换了a,b结果为什么从来不换也?这个题材的确比难知晓。我们可把您的例证转换为一个再度好理解的例子

 

 

变为

变为

def pref3(a)
 a = 5
end

a =1
pref3(a)
puts a #输出 1
def pref3(a)
 a = 5
end

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

一目了然将a传进了,并为它们赋值为5,为什么还是1吗?我们格外当然的足想到是无是外围的a和艺术被的a不是与一个事物。为了证明,我们尤其改造我们的主意

明朗将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
def pref3(a)
a = 5
a.object_id
end

a =1
a.object_id #输出3

pref3(a) #输出11
puts a

 

 

俺们发现少只a的object_id不同,他们无是一个对象,而是少只。

咱们发现有限独a的object_id不同,他们非是一个目标,而是简单只。

 现在咱们知道了问题的要,方法吃之地方变量a指为了目标5,而外部的a仍旧指向的凡目标1.

 现在我们理解了问题之基本点,方法被的地头变量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的援。
  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没有丝毫影响。因为他俩向保存之尽管是见仁见智的目标的援。

今昔悔过想想你的法中传上的a,b虽然交换了岗位,但是本着标定义之a,b没有丝毫影响。因为她们根本保存之哪怕是例外的靶子的援。

ruby传递的是
引用的拷贝 并无是援引的本身。(其实就可以清楚呢价值传递)
而是于基本型是直传送对象自我的。举个例子:
可以参照这http://www.ruby-doc.org/core-1.9/classes/Fixnum.html
写道

ruby传递的是
引用的拷贝 并无是援的本人。(其实就算可以掌握呢价值传递)
唯独对于着力型是直接传送对象自我的。举个例子:
可以参考这http://www.ruby-doc.org/core-1.9/classes/Fixnum.html
写道

 

 

“Fixnum
objects have immediate value. This means that when they are assigned or
passed as parameters, the actual object is passed, rather than a
reference to that object. Assignment does not alias Fixnum objects.
There is effectively only one Fixnum object instance for any given
integer value, so, for example, you cannot add a singleton method to a
Fixnum.“.

“Fixnum
objects have immediate value. This means that when they are assigned or
passed as parameters, the actual object is passed, rather than a
reference to that object. Assignment does not alias Fixnum objects.
There is effectively only one Fixnum object instance for any given
integer value, so, for example, you cannot add a singleton method to a
Fixnum.“.

 

 

自我道这篇稿子会结束是话题了:http://www.khelll.com/blog/ruby/c-passes-by-reference-java-and-ruby-dont/

自觉着就首文章能结束这话题了:http://www.khelll.com/blog/ruby/c-passes-by-reference-java-and-ruby-dont/

再度有意思的讨论进程:http://www.khelll.com/blog/ruby/ruby-pass-by-value-or-by-reference/

重新有趣的座谈进程:http://www.khelll.com/blog/ruby/ruby-pass-by-value-or-by-reference/

 

 

 

 

收集整理自:http://www.iteye.com/topic/1117575 作者:洛克刘大神
 万分感谢~~

收集整理自:http://www.iteye.com/topic/1117575 作者:洛克刘大神
 万分感谢~~