Как заменить существующие операторы, не вызывая их в Io?
Я пытаюсь завершить второе упражнение в день 2-го дня в книге "Семь языков за семь дней". В нем вы спросили: "Как бы вы изменили /, чтобы вернуть 0, если знаменатель равен нулю?" Я решил, что я могу добавить метод в число, используя:
Number new_div := method(i, if(i != 0, self / i, 0))
Что я не уверен, как заменить "/" в таблице операторов. Ive попытался:
Number / := Number new_div
Number / := self new_div
Но я получаю исключение для обоих, поскольку он пытается вызвать "/". Как получить дескриптор на Number/, чтобы я мог хранить ссылку на старый метод, а затем переопределить его для моих собственных целей? Неужели я все это делаю неправильно?
Ответы
Ответ 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)))