Project1

标题: 关于Ruby的一些不用 clone 就会数据崩溃的指令操作 [打印本页]

作者: 纯属小虫    时间: 2022-12-15 00:20
标题: 关于Ruby的一些不用 clone 就会数据崩溃的指令操作
本帖最后由 纯属小虫 于 2022-12-15 14:07 编辑

Ruby学习得不是很扎实
一直摸不清面向对象的真正意义是什么
有人说,所有的变量其实都只是给对象贴一个标签,“变量名 = 变量名”的意义更像是给对象贴上一个不同名的标签,但本质还是同一个对象

直到今天发现了以下几个问题,才好像发现了雷区......

"="  !=  "copy"

试错code


想请求有经验的大佬们讲解一下,哪些情况下,只用 = 得来的数据,在改变其的时候会连母体也一起改掉
什么情况下需要用clone指令
什么情况下用 = 给变量赋值后,要注意哪些操作可能改变“母变量”
hmmmmm,如果有“面向对象”的比较易懂的讲解,也可以请教一下~~~
作者: enghao_lim    时间: 2022-12-15 03:15
片面上你可以理解除了数字(numeric),其他的等于(=)皆为指针赋值,所以用a=b时不然a还是b,都是指向同个对象。
不过文字串重定义了(+)和(-),所以哪怕是用(=)赋值也会返回本体的克隆。举例:
  1. a = "Hi"
  2. b = a
  3. b += " World"
  4. p a # => Hi
  5. p b # => Hi World
复制代码

至于slice!或者sub!等并不会返回本体克隆,所以会直接对原对象操作。
函数的返回必须查了官方文档才会知道。
作者: 喵呜喵5    时间: 2022-12-15 12:10
小 心 浅 拷 贝

  1. data = [1,2,3]
  2. data2 = [4, data]

  3. data3 = data2.clone
  4. data3[0] = 5
  5. data3[1][0] = 5

  6. msgbox data
  7. msgbox data2
  8. msgbox data3
复制代码

作者: 百里_飞柳    时间: 2022-12-15 12:38
你要这样想,等号是给一个变量对象起名字
这个变量对象是在起名字之前生成的,不是
所以再次调用等号的时候,还是给它起个新名字

而调用clone的时候,就是生成一个新的它
作者: 灯笼菜刀王    时间: 2022-12-15 15:35
本帖最后由 灯笼菜刀王 于 2022-12-15 15:37 编辑

简单的说, 要使用 F1 里有注明 "返回本身" 的命令, 都会改动本体, 如果不想动本体, 那就给它clone

而不让你clone的对象, 会给你弹无方法错误, 那就表示它可以直接 a = b
作者: RPGzh500223    时间: 2022-12-15 15:46
可以看F1的Object部分
ruby对象 可以简单分为 立即值对象(Object#dup有提到) 与 非立即值对象
Object#object_id F1定义: 返回与各个对象对应的唯一的整数。但是,为某对象分配整数的具体情形并不固定。

个人理解:
“变量 = ??”    可以看作   "变量 = ??.object_id"
代码执行大概过程:变量名 => 变量值 => 对象object_id => 对象 => 调用方法什么的

方法也可以简单分为 破坏性方法 与 非破坏性方法,这个就看文档,一般都会说明,能记住最好,
起码得有点印象,至少能快速搜索到相关内容,再就是多用用,错多了就记住了。

“面对对象”,直接网上搜索吧……,个人目前理解就是少写些代码
作者: qq634488405    时间: 2022-12-16 09:53
之前数组内的字符串用数组clone没用。。于是后面碰上直接深拷贝完事。。。
  1. class Object
  2.   def deep_clone
  3.     Marshal::load(Marshal.dump(self))
  4.   end
  5. end
复制代码





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