设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2660|回复: 19

[已经解决] [已解决]Ruby 入门教程一段代码疑问?

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14081
在线时间
2138 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

发表于 2019-5-3 17:32:55 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 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的值相等才对,不知道哪里理解错误了我。

1.png
我理解的草图
QQ截图20190503173758.png
2.png

Lv5.捕梦者

梦石
0
星屑
33128
在线时间
10482 小时
注册时间
2009-3-15
帖子
4756
发表于 2019-5-3 17:44:34 | 显示全部楼层
b = a 只是代入a当时的值..所以其实等同 b = 2
a后来改变也不关b的事了..

点评

那这么说数组哪个,我只是改变了a[2]的数值也不影响b啊。  发表于 2019-5-3 18:07
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
20895
在线时间
9331 小时
注册时间
2012-6-19
帖子
7105

开拓者短篇九导演组冠军

发表于 2019-5-3 18:33:37 | 显示全部楼层
本帖最后由 喵呜喵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 这个数据的别名

点评

我也一直很迷惑这个,喵大这一解释竟然明白了,太感谢了  发表于 2019-5-4 01:29
a=2,b=a,a=3,居然是a设置了两个路径,一个是2一个是3  发表于 2019-5-3 21:59

评分

参与人数 1星屑 +70 收起 理由
RyanBern + 70 认可答案

查看全部评分

回复 支持 1 反对 0

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33128
在线时间
10482 小时
注册时间
2009-3-15
帖子
4756
发表于 2019-5-3 19:16:09 | 显示全部楼层
原来如此..所以数组有这些方法..
dup
生成一个与被调内容一样的新数组并返回它。clone 会拷贝 freeze、特殊方法等信息,而 dup 则只拷贝内容。然而,无论哪个方法都不会拷贝数组单元本身。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

发表于 2019-5-3 19:16:54 | 显示全部楼层
因为小于等于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(改了指向本身)

点评

从ruby的源码知道的 对了 我忘记了 Symbol 也是不指向内存的 不过它的值不固定 在运行中生成对应表  发表于 2019-5-3 23:06
不过从你的回答还是学到不少 a=nil其实是a指向4 这4表示nil 不指向内存块 a="123" 就是a指向0xXXXXX啥的 a=4 是 a指向9 也即是 0b1001 这些是怎么得到了结论?   发表于 2019-5-3 22:47
我觉得喵呜喵5讲的很好啊..我解释错了重点..我说的改b 是说改b的一部分 你那样是直接改引用了 意思不一样的  发表于 2019-5-3 22:32
我哪块理解不对了吗?  发表于 2019-5-3 22:12
按照你说的字符串类型指向内存,改b就相当于改a,但是测试结果不是,a = "123",b = a,a = "222",print b #“123”  发表于 2019-5-3 22:12
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

发表于 2019-5-3 19:30:27 | 显示全部楼层
本帖最后由 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是“立即值”。

捕获.PNG

点评

https://ruby-doc.com/core/Array.html#method-i-5B-5D-3D  发表于 2019-5-3 23:06
:[]=方法 哪里有详细说明,我怎么找不到  发表于 2019-5-3 21:22
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 1 反对 0

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4583
在线时间
1205 小时
注册时间
2016-4-7
帖子
982

开拓者

发表于 2019-5-3 19:49:02 | 显示全部楼层
值类型 和引用类型

点评

能详细介绍下这两种引用吗?有什么区别,什么情况是什么样的  发表于 2019-5-3 22:45
附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
10
星屑
39440
在线时间
1914 小时
注册时间
2010-11-14
帖子
3315

R考场第七期纪念奖

发表于 2019-5-3 20:22:33 | 显示全部楼层
本帖最后由 KB.Driver 于 2019-5-3 20:29 编辑

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

一般对象
QQ截图20190503202213.jpg

数字
QQ截图20190503202918.jpg

点评

结论试理解,哈哈,简单粗暴  发表于 2019-5-3 22:13
用头画头像,用脚写脚本
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-16 11:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表