跳至内容

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 在解析器中已知,但它在第一次使用时没有合理的内存值,因此它试图将无效内存追加到原型列表。在第二种形式中,该槽对解析器是已知的,并且也包含一个有效的对象,因此它可以正常工作。

华夏公益教科书