2010-11-23 23 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)))