Каково значение «я» внутри метода? - PullRequest
3 голосов
/ 27 ноября 2011

Я читаю Семь языков программирования за семь недель, и одна из проблем гласит:

Как бы вы изменили /, чтобы вернуть 0, если знаменатель равен нулю?

Сначала я попытался определить свой собственный / и передать его реализацию исходному методу /, например так:

Number oldSlash := Number getSlot("/")
Number / = method(x, Number oldSlash(x))

Однако это не сработало для меня. После некоторого поиска в Google я нашел похожий кусок кода. Код, который я нашел, использовал self в реализации метода. Итак, я попытался использовать self, и, похоже, он работал нормально:

Number oldSlash := Number getSlot("/")
Number / = method(x, self oldSlash(x))

Мой вопрос: Почему это работает, когда используется ключевое слово self, и почему оно не работает, когда вместо него используется Number?

Ответы [ 2 ]

4 голосов
/ 27 ноября 2011

Краткая версия:

Number - это «базовый класс» для чисел;не фактическое числовое значение.Вы не можете использовать его для математических операций.self представляет объект, на который был вызван ваш метод, и это число, которое вы хотите использовать в качестве числителя в своем подразделении.

Более длинная версия:

Сначала немного предыстории: деление, как вы знаете, принимает два аргумента.Метод, который вы определяете, принимает только один аргумент (x).Другой аргумент неявный, и это номер, на который вы вызываете деление.Чтобы было кристально ясно, когда вы пишете a / b, метод / вызывается для объекта a и ему передается значение b в качестве параметра.На более C-подобном языке вы бы сказали что-то вроде a.divide(b).Вы не передаете a в качестве параметра, но в любом случае он доступен из функции, как self.

Итак, используя то, что мы знаем сверху, запись self oldSlash(x) выполняет деление с использованием self в качестве числителя и x в качестве знаменателя.Значение self устанавливается, когда вызывается ваш метод "newSlash", еще раз неявно для объекта, для которого вы вызываете метод.Если вы знакомы с JavaScript, self - это имя Ио для this.

Когда вместо этого вы пишете Number oldSlash(x), вы используете объект Number в качестве числителя в подразделении.Number это не фактическое число, а "базовый класс" для всех чисел.Это не имеет значения.Следовательно, вы не можете выполнять математические операции над ним.

0 голосов
/ 05 декабря 2011

Из Io Руководство по программированию

Все методы (кроме нового) имеют структуру ("объект") в качестве первого аргумента, переменная называется "self".

Но вы можете опустить self, неявно:

Number oldSlash := Number getSlot("/")
Number / = method(x, oldSlash(x))
...