Подтвердить что ты не робот

Как заменить существующие операторы, не вызывая их в Io?

Я пытаюсь завершить второе упражнение в день 2-го дня в книге "Семь языков за семь дней". В нем вы спросили: "Как бы вы изменили /, чтобы вернуть 0, если знаменатель равен нулю?" Я решил, что я могу добавить метод в число, используя:

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

Что я не уверен, как заменить "/" в таблице операторов. Ive попытался:

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

Но я получаю исключение для обоих, поскольку он пытается вызвать "/". Как получить дескриптор на Number/, чтобы я мог хранить ссылку на старый метод, а затем переопределить его для моих собственных целей? Неужели я все это делаю неправильно?

4b9b3361

Ответ 1

Для Эрика Хога (см. вопрос):

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

Ответ 2

Что вы хотите сделать:

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

Например.

Однако следует отметить, что у вас будет бесконечный цикл на ваших руках, если вы используете это определение new_div, так как вы вызываете метод / внутри него и устанавливаете оператор / для использования new_div вызовет вызов, 6 / 2, чтобы перезаписать, пока у вас не закончится память.

Ответ 3

Что делать, если вы использовали оператор мощности внутри вашего переопределения, тогда вам не нужно указывать ссылку на старый оператор разделения.

Number / := method(i, if(i==0, 0, self*i**(-1)))