以下引用紫苏于2009-5-28 21:43:56的发言:
这个是对象的引用,如果你直接把一个对象赋值给另一个对象,那么就是一个引用拷贝的过程,两个数组对象指向的是同一个地址,所以无论改变哪一个数组都会改变同一块内存~
可以利用对象的克隆机制让对象在内存中完全复制一份再把地址赋给引用变量,这样两个相同内容的对象就指向两块不同的独立的内存了
至于这种会改变本身的方法有很多,比如 String 的 gsub!、swapase!,Array 的 compact!、uniq! 等带感叹号的原地(in-place)算法的都会有这种现象~
以下引用杨飞云于2009-5-28 23:41:41的发言:
不过如果要克隆自己设计的类的对象,比如一个 Window 的子类包含了另外一个 Window 对象,需要去重载 clone 来实现深层次的克隆,也就是递归调用各个实例成员对象的 clone 方法,否则的话仅仅是拷贝了这个 Window 类对象本身,而没有拷贝它的成员变量的对象~
dup只会复制内容,
而clone会连同特殊方法、污染旗标(taint?)、冻结资讯(frozen?)一并复制
也就是说只能做到表层复制??
class Array
def clone
obj = super
for i in 0...obj.size
begin
obj = self.clone
rescue TypeError
next
end
end
return obj
end
end
a = [[[1], 2], [3, 4]]
b = a.clone
b[0][0][0] = 32767
p a[0][0][0] # <-- 1
何谓
污染旗标(taint?)
$SAFE = 2
str = "damn"
str.taint
eval(str) # Error!
何谓
冻结资讯(frozen?)
arr = [1, 2, 3, 4]
arr.freeze
arr[1] = 3 # Error!
而特殊方法又是因为什么才叫特殊方法??
以下引用紫苏于2009-5-29 5:23:33的发言:
这个很简单,就是冻结一个对象,让它无法被修改了~要注意它冻结的是对象本身,而不是一个引用变量 =)
以下引用精灵使者于2009-5-29 7:09:22的发言:
已经冻结的变量和常量(恒量)的管理方法应该是一样的吧。
怎样解除已经冻结的变量?
以下引用霜冻之狼于2009-5-29 7:27:23的发言:
但是....与其冻结他,对它不使用操作命令不是更好吗?
以下引用紫苏于2009-5-29 5:23:33的发言:
而特殊方法又是因为什么才叫特殊方法??
这个……还真不知道什么特殊方法不会被 dup 复制
刚才试了下,跟访问权限没关系诶
[本贴由作者于 2009-5-29 6:14:18 最后编辑]
以下引用灼眼的夏娜于2009-5-29 8:39:30的发言:
class A
end
class << a = A.new
def func1
:func1
end
end
b = a.dup
a.func1 # ok
b.func1 # undefined method `func1'
c = a.clone
c.func1 # ok
class A
end
a = A.new
def a.fn
end
b = a.dup
c = a.clone
a.fn # OK
b.fn # Error!
c.fn # OK
以下引用灼眼的夏娜于2009-5-29 8:54:02的发言:
一样的 - -神么 呃呃。。= =
话说紫苏的程序学的挺好的><
以下引用紫苏于2009-5-29 5:23:33的发言:
你书上这样说的话其实有点问题 ^__^
dup 和 clone 都会拷贝对象的污染状态,但 dup 不会拷贝对象的冻结状态,这就是区别~
以下引用TERENCE于2009-5-29 10:55:30的发言:
一个问题我竟然衍伸出那麼多个问题,
看来我的RUBY功力还不深厚啊啊啊.........
class Person
def initialize(name)
@name = name
@health = 100
end
def say_hello
print "你好,我的名字是#@name,请多指教!"
end
end
zhangsan = Person.new("张三")
lisi = Person.new("李四")
def zhangsan.smoke
@health -= 1
end
zhangsan.say_hello # OK
lisi.say_hello # OK
zhangsan.smoke # OK
lisi.smoke # Error! 此人不会抽烟……
a = A.new
class << a
以下引用蓝の星辰于2009-6-5 19:28:05的发言:
以下引用hitlerson于2009-6-4 12:07:57的发言:
好久没来提问区了竟出现如此牛贴
强贴留名以哄抬身价
同,不知紫苏是那位同学的马甲
以下引用精灵使者于2009-5-29 7:09:22的发言:
已经冻结的变量和常量(恒量)的管理方法应该是一样的吧。
怎样解除已经冻结的变量?
其实这个破坏的方法是有用处的,例如我经常要用到。
只需要修改一个修改区的变量就可以更改其他的数据区和功能区的变量,而不用繁琐的反复引用。
关于污染旗标,在RM里面最明显的就是用一些脚本来进行解密——如果能直接提升RM脚本中污染旗标的等级其实是最好的一种反解密的方法。
我用 RM 的时间可能比本帖的所有人都长,所以多知道点不足为奇
以下引用精灵使者于2009-6-6 8:42:59的发言:
我不知道RM的污染旗标的值是在什么地方的。
如果提升的话可以预防解密,但是可能会对事件执行脚本造成不良影响
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |