Project1

标题: [已解决]Ruby 入门教程一段代码疑问? [打印本页]

作者: miantouchi    时间: 2019-5-3 17:32
标题: [已解决]Ruby 入门教程一段代码疑问?
本帖最后由 miantouchi 于 2019-5-5 14:54 编辑

RUBY 代码复制
  1. a = 2
  2. b = a
  3. a = 3
  4. print b #print 是系统内部的输出函数

RUBY 代码复制
  1. a = [1,2,3]
  2. b = a
  3. a[2] = 4 #这是给数组第2号单元赋值为4
  4. print b

解释中说,在(1)中改变了a的值,但是b的值没变;但是在(2)中就不同了,对a进行的某种操作也会在b那里反映出来。但是,无论是哪种情况,在执行b=a之后,a和b表示的是同一块数据(指向内存中的同一片区域,即地址),而不是相同数据的不同拷贝,或者说,b是a的一个别名,你要找这片内存区域,说a也行,说b也行。

既然b是a的别名的意思,那a和b的值也应该相等啊也应该是3啊。
下面是教程中用的分析指针图,按照图演示也应该是a和b的值相等才对,不知道哪里理解错误了我。


我理解的草图


作者: soulsaga    时间: 2019-5-3 17:44
b = a 只是代入a当时的值..所以其实等同 b = 2
a后来改变也不关b的事了..
作者: 喵呜喵5    时间: 2019-5-3 18:33
本帖最后由 喵呜喵5 于 2019-5-3 18:43 编辑

数组数据和名称是两个独立的东西

  1. a = []
复制代码


实际上干了两件事,一个是创造了一个数组,一个是将a的值设置为该数组的访问路径(正式的说法叫引用)

  1. b = a
复制代码


实际上干的事情是将b的值也设置为该数组的访问路径

因为访问路径和数组本身是独立的两个东西,所以只要访问路径相同,不管是在a里面还是在b里面,都能修改到访问路径目标的数组

所以

  1. print a #a 是数组的访问路径,所以输出数组
  2. print b #b 也是数组的访问路径,所以输出同一个数组
  3. a[1] = 1 #获取访问路径对应的数组,修改数组中的值
  4. print b #因为b的访问路径对应的仍然是同一个数组,所以b的值也发生变化
复制代码


按照这个思路看你的问题:

  1. a = 2 #a 设置为2的访问路径
  2. b = a #b 也设置为2的访问路径
  3. a = 3 #a 设置为3的访问路径
  4. print a #a 记录了3的访问路径,所以输出3
  5. print b #b记录了2的访问路径,所以输出2
复制代码



你理解中错误的地方是:

你觉的

a = 3
b = a

是将 3 保存到 a 中,将 b 设置为 a 的别名

实际上真正的概念是:

a = 3
b = a

是创造了一个 3 的数据,a 是 3 这个数据的别名,b也是 3 这个数据的别名
作者: soulsaga    时间: 2019-5-3 19:16
原来如此..所以数组有这些方法..
dup
生成一个与被调内容一样的新数组并返回它。clone 会拷贝 freeze、特殊方法等信息,而 dup 则只拷贝内容。然而,无论哪个方法都不会拷贝数组单元本身。

作者: SixRC    时间: 2019-5-3 19:16
因为小于等于31比特的整数
以及 true false nil
都属于立即数 也就是不涉及内存的
其余都开辟内存来储存
a=3 b=a a和b都是3 没有新开辟内存来存3
也就不存在指向的相同问题
a="123" b=a
这时候的 b等于a 是b指向了a指向的内存对象
也就是这个字符串
比方
a=nil
其实是a指向4 这4表示nil 不指向内存块
而a="123" 就是a指向0xXXXXX啥的
a=4 是 a指向9 也即是 0b1001
总之
b=a是b指向了a指向的东西
假如a指向内存
改b就相当于改a(改了指向内存块的内容)
不然改b就是改b(改了指向本身)
作者: guoxiaomi    时间: 2019-5-3 19:30
本帖最后由 guoxiaomi 于 2019-5-3 19:36 编辑

赋值语句左边只能是一个变量名,否则就是调用方法。
  1. a[0] = 1
复制代码
不是给数组中的第一个元素赋值,而是调用了 :[]= 方法,参数写在[]里是语法糖,你试一下:
  1. a.[]=(0, 1) # 相当于 a[0] = 1
  2. a.first = 1 # 报错
  3. a1 = a.first # a[0] 的值赋值给变量 a1
  4. a1 = 1 # 1 赋值给变量 a1
复制代码


此外,Fixnum和Symbol是“立即值”。


作者: shitake    时间: 2019-5-3 19:49
值类型 和引用类型


作者: KB.Driver    时间: 2019-5-3 20:22
本帖最后由 KB.Driver 于 2019-5-3 20:29 编辑

你可以简单的记住,对绝大多数对象而言,你用=号赋值得到的是同一个引用。
但是对数字,这一点不适用。

一般对象


数字





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1