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