Io 编程/陷阱
外观
< Io 编程
A := Object clone do( ... init := method( ... ) )
现在,你可以使用 A
对象,但 A
对象尚未初始化(通过 init
方法)。init
方法仅在克隆 A
对象时调用。例如,如果你为对象实现了自己的 clone
方法,这可能会“咬你”。
如果变量/槽被分配了一个可激活的对象,你需要使用 getSlot("varname") 来获取相同的对象。否则,该对象将被激活,你将获得激活的结果。一个这样的可激活对象是方法。
例如,如果你想进行一些内省,并检查对象的方法
method_to_inspect := Object getSlot("asString") # print the code of this method getSlot("method_to_inspect") code println # error, (Object asString), a String, doesn't understand the code message method_to_inspect code println
尝试将对象的原型设置为该对象所包含的对象,例如
A := Object clone do( B := Object clone B appendProto(A) )
会导致 IoVM 由于 Segmentation Fault
而崩溃。你需要用以下代码替换它
A := Object clone A do( B := Object clone B appendProto(A) )
A 在解析器中已知,但它在第一次使用时没有合理的内存值,因此它试图将无效内存追加到原型列表。在第二种形式中,该槽对解析器是已知的,并且也包含一个有效的对象,因此它可以正常工作。