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,都是指向同个对象。
不过文字串重定义了(+)和(-),所以哪怕是用(=)赋值也会返回本体的克隆。举例:
a = "Hi"
b = a
b += " World"
p a # => Hi
p b # => Hi World
复制代码
至于slice!或者sub!等并不会返回本体克隆,所以会直接对原对象操作。
函数的返回必须查了官方文档才会知道。
作者:
喵呜喵5
时间:
2022-12-15 12:10
小 心 浅 拷 贝
data = [1,2,3]
data2 = [4, data]
data3 = data2.clone
data3[0] = 5
data3[1][0] = 5
msgbox data
msgbox data2
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没用。。于是后面碰上直接深拷贝完事。。。
class Object
def deep_clone
Marshal::load(Marshal.dump(self))
end
end
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1