Введение

В языках программирования объект или класс, которому принадлежит выполняемый код.

`this`, `self` и `Me` — ключевые слова, используемые в некоторых языках программирования для ссылки на объект, класс или другую сущность, частью которой является выполняемый код. Сущность, на которую осуществляется ссылка, зависит от контекста выполнения (например, для какого объекта вызван его метод). Различные языки программирования используют эти ключевые слова несколько по-разному. В языках, где ключевое слово, такое как `this`, является обязательным, оно является единственным способом доступа к данным и методам, хранящимся в текущем объекте. В тех случаях, когда использование этих ключевых слов необязательно, они могут использоваться для устранения неоднозначности между переменными и функциями с одинаковым именем.

Объектно-ориентированное программирование

Во многих объектно-ориентированных языках программирования это (также называемое self или Me) — переменная, используемая в методах экземпляра для ссылки на объект, с которым они работают. Первый язык ОО, SIMULA 67, использовал это для явной ссылки на локальный объект. C++ и языки, заимствующие его стиль (такие как Java, C#, D и PHP), также обычно используют это. Smalltalk и другие, такие как Object Pascal, Perl, Python, Ruby, Rust, Objective C, DataFlex и Swift, используют self. В Visual Basic от Microsoft используется Me. Концепция схожа во всех языках: это обычно неизменяемая ссылка или указатель на текущий объект; текущий объект часто является кодом, выступающим в роли "родителя" или "инициатора" для свойства, метода, подпрограммы или функции, содержащих это ключевое слово. После того как объект правильно сконструирован или инстанцирован, это всегда является допустимой ссылкой. Некоторые языки требуют его явного указания; другие используют лексическую область видимости, чтобы использовать его неявно и сделать символы внутри класса видимыми. В качестве альтернативы, текущий объект, на который ссылается это, может быть независимым кодовым объектом, вызвавшим функцию или метод, содержащий ключевое слово this. Например, это происходит, когда обработчик событий JavaScript, прикрепленный к HTML-тегу на веб-странице, вызывает функцию, содержащую ключевое слово this, хранящееся в глобальном пространстве вне объекта документа; в этом контексте это будет ссылаться на элемент страницы внутри объекта документа, а не на объект окна. В некоторых языках, например C++, Java и Raku, this или self является ключевым словом, и переменная автоматически существует в методах экземпляра. В других, например Python, Rust и Perl 5, первый параметр метода экземпляра является такой ссылкой. Его необходимо указывать явно. В Python и Perl параметр не обязательно должен называться this или self; его может свободно именовать программист, как и любой другой параметр. Однако, по неформальной конвенции, первый параметр метода экземпляра в Perl или Python называется self. Rust требует, чтобы объект self назывался &self или self, в зависимости от того, заимствует ли вызываемая функция объект-инициатор или перемещает его. Статические методы в C++ или Java не связаны с экземплярами, а с классами, и поэтому не могут использовать это, поскольку объекта не существует. В других языках, таких как Ruby, Smalltalk, Objective C или Swift, метод связан с объектом класса, который передается как this, и они называются методами класса. Для методов класса Python использует cls для доступа к объекту класса.

Недостатки и трудности

Когда для определения значения `this` используется лексическая область видимости, использование `this` в коде, хотя и не является ошибкой, может насторожить программиста, поддерживающего код. Однако в этом случае существуют и законные причины для использования `this`, например, для обращения к переменным экземпляра, скрытым локальными переменными с тем же именем, или если метод должен вернуть ссылку на текущий объект, то есть на сам объект `this`. В некоторых компиляторах (например, GCC) указатели на методы экземпляров C++ можно напрямую привести к указателю другого типа, с указанием параметра `this`.

C++

Ранние версии C++ позволяли изменять указатель `this`; таким образом, программист мог изменить объект, над которым работал метод. Эта возможность была впоследствии удалена, и теперь `this` в C++ является r-значением. В ранних версиях C++ не было ссылок, и предполагается, что если бы они присутствовали в C++ с самого начала, `this` был бы ссылкой, а не указателем. C++ позволяет объектам самоуничтожаться с помощью оператора исходного кода: `delete this`.

Язык

Ключевое слово `this` в C# работает аналогично Java для ссылочных типов. Однако для типов значений в C# оно имеет совершенно иную семантику, напоминая обычную изменяемую переменную и даже может встречаться слева от оператора присваивания. Одно из применений `this` в C# – возможность обращения к полю внешнего класса в методе, содержащем локальную переменную с тем же именем. В такой ситуации, например, оператор `var n = localAndFieldname;` внутри метода присвоит переменной `n` тип и значение локальной переменной `localAndFieldname`, а оператор `var n = this.localAndFieldname;` присвоит переменной `n` тип и значение поля внешнего класса.

Д.

В D, в методе класса, структуры или объединения, `this` относится к неизменной ссылке на экземпляр включающего агрегата. Классы являются ссылочными типами, а структуры и объединения – типами значений. В первой версии D ключевое слово `this` использовалось как указатель на экземпляр объекта, к которому привязан метод, в то время как в D2 оно функционирует как неявный аргумент функции по ссылке.

Ява

Ключевое слово `this` — это ключевое слово языка Java, которое представляет текущий экземпляр класса, в котором оно используется. Оно применяется для доступа к полям и методам класса. Так как все методы экземпляра в Java являются виртуальными, `this` никогда не может быть равно `null`.

PowerShell (полное описание)

В PowerShell специальная автоматическая переменная $ содержит текущий объект в конвейере. Вы можете использовать эту переменную в командах, которые выполняют действие над каждым объектом или над выбранными объектами в конвейере. "one", "two", "three" | % { write $ } Начиная с PowerShell 5.0, который добавляет формальный синтаксис для определения классов и других пользовательских типов, переменная $this описывает текущий экземпляр объекта.

Python (англ.)

В Python нет ключевого слова для этого. Когда метод экземпляра вызывается для объекта, он вызывает метод с тем же именем в классе этого объекта, при этом сам объект автоматически передается в качестве первого аргумента. Таким образом, обязательный первый параметр методов экземпляра представляет собой ссылку на сам объект; этот параметр по соглашению называется `self`, но может иметь любое другое имя. В классовых методах (создаваемых с помощью декоратора `classmethod`) первый аргумент ссылается на сам класс, и по соглашению называется `cls`; они в основном используются для наследуемых конструкторов, где передача класса в качестве параметра позволяет подклассам переопределять конструктор. В статических методах (создаваемых с помощью декоратора `staticmethod`) специального первого аргумента нет.

Самостоятельность

Язык Self получил своё название от этого использования слова "self".

Xbase++

Self строго используется внутри методов класса. Другой способ обратиться к Self — использовать ::.