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

Project1

 找回密码
 注册会员
搜索

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

查看数: 3222 | 评论数: 7 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-5-3 17:32

正文摘要:

本帖最后由 miantouchi 于 2019-5-5 14:54 编辑 RUBY 代码复制a = 2b = aa = 3print b #print 是系统内部的输出函数a = 2 b = a a = 3 print b #print 是系统内部的输出函数 RUBY É ...

回复

KB.Driver 发表于 2019-5-3 20:22:33
本帖最后由 KB.Driver 于 2019-5-3 20:29 编辑

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

一般对象


数字

点评

结论试理解,哈哈,简单粗暴  发表于 2019-5-3 22:13
shitake 发表于 2019-5-3 19:49:02
值类型 和引用类型

点评

能详细介绍下这两种引用吗?有什么区别,什么情况是什么样的  发表于 2019-5-3 22:45
guoxiaomi 发表于 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是“立即值”。

点评

https://ruby-doc.com/core/Array.html#method-i-5B-5D-3D  发表于 2019-5-3 23:06
:[]=方法 哪里有详细说明,我怎么找不到  发表于 2019-5-3 21:22
SixRC 发表于 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
soulsaga 发表于 2019-5-3 19:16:09
原来如此..所以数组有这些方法..
dup
生成一个与被调内容一样的新数组并返回它。clone 会拷贝 freeze、特殊方法等信息,而 dup 则只拷贝内容。然而,无论哪个方法都不会拷贝数组单元本身。
喵呜喵5 发表于 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 认可答案

查看全部评分

soulsaga 发表于 2019-5-3 17:44:34
b = a 只是代入a当时的值..所以其实等同 b = 2
a后来改变也不关b的事了..

点评

那这么说数组哪个,我只是改变了a[2]的数值也不影响b啊。  发表于 2019-5-3 18:07
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

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

GMT+8, 2024-11-13 12:01

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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