2010-11-23 47 views
30

我正在嘗試完成IO天第二天練習七天中的七種語言。在它的問道:「你會怎樣改變/返回0,如果分母爲零?」我已經決定,我可以使用添加一個方法來編號:如何替換現有的操作符而不用在Io中調用它們?

Number new_div := method(i, if(i != 0, self/i, 0)) 

什麼我不知道是怎麼替換操作符表中的「/」。我試過了:

Number/:= Number new_div 
Number/:= self new_div 

但是我得到一個異常,因爲它試圖調用「/」。如何獲得Number /的句柄,以便我可以存儲對舊方法的引用,然後爲我自己的目的重新定義它?我是否全部錯了?

+0

我想解決同樣的問題。我做「Number /:= method(...)」。而且我被卡住了與jer指出的同樣的無限循環。我找不到保留/的原始實現並調用它的方法。 – 2010-11-24 02:25:16

+0

@Eric Hogue:我沒有發佈我的答案,因爲*傑爾*只是打敗了我!我已經發布了它,因爲它確實展示瞭如何保留原始分割並避免遞歸循環。 – draegtun 2010-11-24 12:14:20

回答

39

對於埃裏克·霍格(見問題的評論):

origDiv := Number getSlot("/") 

10 origDiv(5) println # => 2 
10 origDiv(0) println # => inf 

Number/:= method (i, 
    if (i != 0, self origDiv(i), 0) 
) 

(10/5) println  # => 2 
(10/0) println  # => 0 
4

你想要做什麼是運行:

Number setSlot("/", Number getSlot("new_div") 

例如。

但是,應該注意的是,你會如果你使用的是new_div定義,因爲你調用其中的/方法,並設置/操作員使用new_div會造成對你的手無限循環呼叫,6/2進行遞歸,直到內存用完。

+1

這有什麼幫助?你仍然會有一個無限循環。 – TrueWill 2012-03-06 18:25:35

+0

你甚至讀過我寫的東西嗎?我明確地說明了無限循環的可能性。 – jer 2012-03-08 15:57:21

4

,如果你使用的電力運營商的重新定義裏面,那麼你沒有什麼讓老除法運算的參考。

Number/:= method(i, if(i==0, 0, self*i**(-1))) 
相關問題