跳至內容

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 在解析器中已知,但它在第一次使用時沒有合理的記憶體值,因此它試圖將無效記憶體追加到原型列表。在第二種形式中,該槽對解析器是已知的,並且也包含一個有效的物件,因此它可以正常工作。

華夏公益教科書