Это (компьютерное программирование) - This (computer programming)

это, себя, и Мне находятся ключевые слова используется в каком-то компьютере языки программирования для ссылки на объект, класс или другую сущность, частью которой является выполняемый в данный момент код. Таким образом, сущность, на которую ссылаются эти ключевые слова, зависит от контекст исполнения (например, для какого объекта вызывается метод). В разных языках программирования эти ключевые слова используются немного по-разному. В языках, где ключевое слово вроде "this" является обязательным, ключевое слово - единственный способ получить доступ к данным и методам, хранящимся в текущем объекте. Там, где это необязательно, они могут устранять неоднозначность переменных и функций с одинаковыми именами.

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

Во многих объектно-ориентированный языки программирования, это (также называемый себя или же Мне) - переменная, которая используется в методы экземпляра для ссылки на объект, над которым они работают. Первый объектно-ориентированный язык, SIMULA 67, использовал это для явной ссылки на локальный объект.[1]:4.3.2.3 C ++ и языки, стилизованные под него (например, Ява, C #, D, и PHP ) также обычно используют это. Болтовня и другие, такие как Object Pascal, Perl, Python, Рубин, Ржавчина, Цель-C, DataFlex и Быстрый, использовать себя. Microsoft Visual Basic использует Мне.

Концепция одинакова для всех языков: это обычно неизменный ссылка или же указатель который относится к текущему объекту; текущий объект часто является кодом, который действует как «родительский» для свойство, метод, подпрограмма или функция, содержащая это ключевое слово. После того, как объект правильно построен или создан, это всегда действительная ссылка. Некоторые языки требуют этого явно; другие используют лексическая область видимости использовать его неявно, чтобы сделать видимыми символы внутри своего класса. Или, альтернативно, текущий объект, на который ссылается это может быть независимым объектом кода, который вызвал функцию или метод, содержащий ключевое слово это. Такое случается, например, когда JavaScript обработчик событий, прикрепленный к тегу HTML на веб-странице, вызывает функцию, содержащую ключевое слово это хранится в глобальном пространстве вне объекта документа; в этом контексте это будет ссылаться на элемент страницы в объекте документа, а не на закрывающий объект окна.[2]

В некоторых языках, например C ++ и Java, это или же себя это ключевое слово, и переменная автоматически существует в методах экземпляра. В других, например Python, Ржавчина, и Perl 5, такой ссылкой является первый параметр метода экземпляра. Это нужно указать явно. В Python и Perl параметр не обязательно называть это или же себя; программист может произвольно называть его, как и любой другой параметр. Однако по неформальному соглашению первый параметр метода экземпляра в Perl или Python называется себя. Rust требует, чтобы объект self был вызван &себя или же себя, в зависимости от того, заимствует ли вызываемая функция вызывающий объект или перемещает его, соответственно.

Статические методы в C ++ или же Ява связаны не с экземплярами, а с классами, поэтому не могут использовать это, потому что нет объекта. На других языках, например Рубин, Болтовня, Цель-C, или же Быстрый, метод связан с объект класса это передается как это, и они называются методы класса. За методы класса, Python использует cls для доступа к объект класса.

Тонкости и сложности

Когда лексическая область видимости используется для вывода это, использование это в коде, хотя и не является незаконным, может вызвать тревогу у программиста по обслуживанию, хотя все еще есть законное использование это в этом случае, например, ссылка на переменные экземпляра, скрытые локальными переменными с тем же именем, или если метод хочет вернуть ссылку на текущий объект, т.е. это, сам.

В некоторых компиляторах (например GCC ) указатели на методы экземпляра C ++ могут быть напрямую преобразованы в указатель другого типа с явным это параметр указателя.[3]

Открытая рекурсия

Семантика отправки это, а именно этот метод вызывает это отправляются динамически, известна как открытая рекурсия, и означает, что эти методы могут быть переопределены производными классами или объектами. Напротив, прямая именованная рекурсия или анонимная рекурсия функции использует закрытая рекурсия, с ранним связыванием. Например, в следующем Perl код факториала, токен __SUB__ ссылка на текущую функцию:

использовать особенность ":5.16";суб {    мой $ x = сдвиг;    $ x == 0 ? 1 : $ x * __SUB__->( $ x - 1 );}

Напротив, в C ++ (с использованием явного это для ясности, хотя и не обязательно) это привязывается к самому объекту, но если метод класса был объявлен «виртуальным», т.е. полиморфным в базе, он разрешается через динамическую отправку (позднее связывание ), чтобы производные классы могли его переопределить.

беззнаковый int факториал(беззнаковый int п){  если (п == 0)    возвращаться 1;  еще    возвращаться п * это->факториал(п - 1);}

Этот пример искусственный, так как это прямая рекурсия, поэтому переопределение факториал метод переопределит эту функцию; более естественные примеры - это когда метод в производном классе вызывает тот же метод в базовом классе или в случаях взаимной рекурсии.[4][5]

В хрупкий базовый класс проблема была возложена на открытую рекурсию, с предположением, что вызов методов на это по умолчанию используется закрытая рекурсия (статическая отправка, раннее связывание), а не открытая рекурсия (динамическая отправка, позднее связывание), только с использованием открытой рекурсии, когда это специально запрашивается; внешние звонки (без использования это) будет динамически отправляться как обычно.[6][7] На практике это решается в JDK с помощью определенной дисциплины программиста; эта дисциплина была формализована К. Руби и Г. Т. Ливенсом; в основном он состоит из следующих правил:[8]

  • Код не запускается общественный методы на это.
  • Код, который можно повторно использовать внутри (путем вызова из других методов того же класса), инкапсулируется в защищенный или же частный метод; если он также должен быть доступен напрямую пользователям, тогда оболочка общественный метод вызывает внутренний метод.
  • Предыдущая рекомендация может быть ослаблена для чистый методы.

Реализации

C ++

Ранние версии C ++ позволяли это указатель быть изменен; таким образом программист мог изменить объект, над которым работает метод. Эта функция была в конечном итоге удалена, и теперь это в C ++ - это r-значение.[9]

Ранние версии C ++ не содержали ссылок, и было высказано предположение, что если бы они были в C ++ с самого начала, это была бы ссылкой, а не указателем.[10]

C ++ позволяет объектам уничтожать себя с помощью оператора исходного кода: удалить это.

C #

Ключевое слово это в C # работает так же, как в Java, для ссылочных типов. Однако в C # типы значений, это имеет совершенно иную семантику, похожую на обычную изменяемую ссылку на переменную, и может даже встречаться слева от присваивания.

Одно использование это в C # - разрешить ссылку на переменную внешнего поля в методе, который содержит локальную переменную с тем же именем. В такой ситуации, например, утверждение var n = localAndFieldname; внутри метода будет назначен тип и значение локальной переменной localAndFieldname к п, тогда как утверждение var n = this.localAndFieldname; присвоит тип и значение переменной внешнего поля п.[11]

D

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

Дилан

На языке программирования Дилан, который является объектно-ориентированным языком, поддерживающим мультиметоды и не имеет понятия это, отправка сообщения объекту по-прежнему сохраняется в синтаксисе. Две формы ниже работают одинаково; различия просто синтаксический сахар.

объект.method (параметр1, параметр2)

и

метод (объект, параметр1, параметр2)

Эйфель

В тексте класса текущий тип это тип, полученный из текущий класс. Внутри функций (процедур, команд и запросов) класса можно использовать ключевое слово Текущий для ссылки на текущий класс и его функции. Использование ключевого слова Текущий необязательно в качестве ключевого слова Текущий подразумевается простой ссылкой на имя текущего объекта класса открыто. Например: в классе MY_CLASS может быть функция `foo 'и ссылаться на нее следующим образом:

 1   учебный класс 2      МОЙ КЛАСС 3    4   особенность -- Доступ 5    6      фу: ЦЕЛОЕ 7    8      моя_функция: ЦЕЛОЕ 9         делать10           Результат := фу11        конец12  13  конец

[12]

Строка № 10 (выше) подразумевает ссылку на Текущий вызовом простого `foo '.

Строка № 10 (ниже) имеет явную ссылку на Текущий вызовом Current.foo.

 1   учебный класс 2      МОЙ КЛАСС 3    4   особенность -- Доступ 5    6      фу: ЦЕЛОЕ 7    8      моя_функция: ЦЕЛОЕ 9         делать10            Результат := Текущий.фу11        конец12  13  конец

Для компилятора приемлем любой подход, но подразумеваемая версия (например, x: = foo) предпочтительнее, так как он менее подробный.

Как и в случае с другими языками, бывают случаи, когда использование ключевого слова Текущий требуется, например:

 1   учебный класс 2      МОЙ КЛАСС 3    4   особенность -- Доступ 5    6      моя_команда 7            - Создать MY_OTHER_CLASS с помощью `Current ' 8         местный 9            Икс: MY_OTHER_CLASS10        делать11           Создайте Икс.make_with_something (Текущий)12        конец13  14  конец

В случае приведенного выше кода вызов в строке № 11 для make_with_something передает текущий класс, явно передав ключевое слово Текущий.

Ява

Ключевое слово это это Ява ключевое слово language, представляющее текущий экземпляр класса, в котором оно появляется. Он используется для доступа к переменным и методам класса.

Поскольку все методы экземпляра в Java виртуальны, это никогда не может быть нулевым.[13]

JavaScript

В JavaScript, который представляет собой программирование или язык сценариев широко используется в веб-браузерах, это является важным ключевым словом, хотя его оценка зависит от того, где оно используется.

  • При использовании вне какой-либо функции в глобальном пространстве это относится к охватывающему объекту, которым в данном случае является закрывающее окно браузера, окно объект.
  • При использовании в функции, определенной в глобальном пространстве, ключевое слово это относится к, зависит от того, как вызывается функция. Когда такая функция вызывается напрямую (например, f (x)), это будет относиться к глобальному пространству, в котором функция определена, и в котором также могут существовать другие глобальные функции и переменные (или в строгом режиме это неопределенный). Если глобальная функция, содержащая это вызывается как часть обработчика событий элемента в объекте документа, однако это будет ссылаться на вызывающий элемент HTML.
  • Когда метод вызывается с использованием новый ключевое слово (например, var c = новая вещь ()) затем в Thing это относится к самому объекту Thing.
  • Когда функция прикрепляется как свойство объекта и вызывается как метод этого объекта (например, obj.f (x)), это будет ссылаться на объект, в котором содержится функция.[14][15] Можно даже указать вручную это при вызове функции с помощью .вызов() или же .подать заявление() методы объекта функции.[16] Например, вызов метода obj.f (x) можно также записать как obj.f.call (obj, x).

Чтобы обойти различное значение это во вложенных функциях, таких как обработчики событий DOM, в JavaScript часто используется идиома для сохранения это ссылка на вызывающий объект в переменной (обычно называемой который или же себя), а затем используйте переменную для ссылки на вызывающий объект во вложенных функциях.

Например:

// В этом примере $ - это ссылка на библиотеку jQuery $(".элемент").парить(функция() {    // Здесь и то, и то указывают на элемент под курсором мыши.    вар который = это;        $(это).найти('.elements').каждый(функция() {        // Здесь это указывает на повторяющийся элемент DOM.        // Однако это все еще указывает на элемент под курсором мыши.        $(это).addClass("выделять");    });});

Lua

В Lua, себя создается как синтаксический сахар когда функции определены с использованием : оператор.[17] При вызове метода с использованием :, индексируемый объект будет неявно указан в качестве первого аргумента вызываемой функции.

Например, следующие две функции эквивалентны:

местный объект = {}функция объект.фу(arg1, arg2)  Распечатать(arg1, arg2) - здесь нельзя использовать "self"конецфункция объект:бар(аргумент)  Распечатать(себя, аргумент) - "self" - неявный первый аргумент перед argконец- Все функции могут быть вызваны обоими способами с помощью символа "." или с ":"объект:фу("Фу") - эквивалент obj.foo (obj, "Foo")объект.бар(объект, "Бар") - эквивалент obj: bar ("Бар")

Сам Lua не является объектно-ориентированным, но в сочетании с другой функцией, называемой метатаблицами, использование себя позволяет программистам определять функции способом, напоминающим объектно-ориентированное программирование.

PowerShell

В PowerShell особый автоматическая переменная $_ содержит текущий объект в объекте конвейера. Вы можете использовать эту переменную в командах, которые выполняют действие над каждым объектом или выбранными объектами в конвейере.[18]

"один", "два", "три" | % { записывать $_ }

Также начиная с PowerShell 5.0, который добавляет формальный синтаксис для определения классов и других определяемых пользователем типов.[19], $ это переменная описывает текущий экземпляр объекта.

Python

В Python нет ключевого слова для это. Когда функция-член вызывается для объекта, она вызывает функцию-член с тем же именем для объекта класса объекта, при этом объект автоматически связывается с первым аргументом функции. Таким образом, обязательный первый параметр методы экземпляра служит в качестве это; этот параметр условно называется себя, но называть можно как угодно.

В методах класса (созданных с помощью classmethod декоратор), первый аргумент относится к самому объекту класса и обычно называется cls; они в основном используются для наследуемых конструкторов,[20] где использование класса в качестве параметра позволяет создать подкласс конструктора. В статических методах (созданных с помощью статический метод декоратор), специального первого аргумента не существует.

Ржавчина

В Rust типы объявляются отдельно от связанных с ними функций. Функции, аналогичные методам экземпляров в более традиционно объектно-ориентированных языках, должны явно принимать себя как их первый параметр. Затем эти функции можно вызвать с помощью instance.method () синтаксический сахар. Например:

структура Фу{бар: i32,}импФу{fn новый()-> Фу{Фу{бар: 0,}}fn ссылаться(&себя){println!("{}",себя.бар);}fn мутировать(&мутсебя,баз: i32){себя.бар=баз;}fn потреблять(себя){себя.ссылаться();}}

Это определяет тип, Фу, с четырьмя связанными функциями. Первый, Foo :: new (), не является функцией экземпляра и должен указываться с префиксом типа. Остальные три все берут себя параметр различными способами и может быть вызван Фу Экземпляр с использованием синтаксического сахара с точечной нотацией, что эквивалентно вызову имени функции с указанием типа с явным себя первый параметр.

позволятьфу=Фу::новый();// должна вызываться как функция указанного типафу.ссылаться();// выводит "0". Foo :: refer () имеет доступ только для чтения к экземпляру fooфу.мутировать(5);// изменяет foo на место, разрешенное спецификацией & mutфу.потреблять();// выводит "5" и уничтожает foo, так как Foo :: consumer () полностью владеет собой// эквивалент foo.refer ()Фу::ссылаться(фу);// ошибка компиляции: foo выходит за рамки

Себя

В Себя язык назван в честь этого использования слова «я».

Xbase ++

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

Смотрите также

Рекомендации

  1. ^ Даль, Оле-Йохан; Myhrhaug, Bjørn; Найгаард, Кристен (1970). «Общий базовый язык, Норвежский вычислительный центр».
  2. ^ Пауэлл, Томас А. и Шнайдер, Фриц, 2012 г. JavaScript: полный справочник, третье издание. Макгроу-Хилл. Глава 11, Обработка событий, 428 с. ISBN  978-0-07-174120-0
  3. ^ Использование коллекции компиляторов GNU (GCC) - Связанные функции-члены
  4. ^ "Закрытая и открытая рекурсия ", Ральф Хинце, Июль 2007 г.
  5. ^ Открытая рекурсия, Лямбда Окончательный
  6. ^ "Селективная открытая рекурсия: решение проблемы хрупкого базового класса ", Джонатан Олдрич
  7. ^ "Селективная открытая рекурсия: решение проблемы хрупкого базового класса ", Лямбда Окончательный
  8. ^ Олдрич, Джонатан и Кевин Доннелли. "Селективная открытая рекурсия: модульные рассуждения о компонентах и ​​наследовании. "SAVCBS 2004 Specification and Verification of Component-Based Systems (2004): 26. Цитата для принятого JDK решения C. Ruby и GT Leavens." Безопасное создание правильных подклассов без просмотра кода суперкласса ". В системах объектно-ориентированного программирования, языки , и Applications, октябрь 2000 г. Дои:10.1145/353171.353186 также доступен как технический отчет TR № 00-05d
  9. ^ ISO / IEC 14882: 2003 (E): Языки программирования - C ++. ИСО / МЭК. 2003 г.
  10. ^ Страуструп: Часто задаваемые вопросы о стиле и технике C ++
  11. ^ Де Смет, Барт, 2011. C # 4.0 Unleashed. Sams Publishing, Индианаполис, США. Глава 4, Основы языка, стр 210. ISBN  978-0-672-33079-7
  12. ^ ПРИМЕЧАНИЕ. Номера строк приведены только для справки. Eiffel не имеет номеров строк в тексте класса. Однако в Eiffel Studio IDE есть параметр номера строки, который можно дополнительно включить для справочных целей (например, парное программирование и т. Д.).
  13. ^ Барнс, Д. и Келлинг, М. Объекты на первом месте с Java. "... причина использования этой конструкции [this] в том, что у нас есть ситуация, известная как перегрузка имен - одно и то же имя используется для двух разных сущностей ... Важно понимать, что поля и параметры являются отдельными переменными, которые существуют независимо друг от друга, даже если они имеют похожие имена. Параметр и поле с одинаковым именем на самом деле не проблема в Java ".[нужна цитата ]
  14. ^ Крокфорд, Дуглас, 2008. JavaScript: хорошие стороны. O'Reilly Media Inc. и Yahoo! Inc. Глава 4, Функции, стр 28. ISBN  978-0-596-51774-8
  15. ^ Пауэлл, Томас А. и Шнайдер, Фриц, 2012 г. JavaScript: полный справочник, третье издание. Макгроу-Хилл. Глава 5, Функции, pp 170–1. ISBN  978-0-07-174120-0
  16. ^ Гудман, Дэнни, с Моррисоном, Майклом, 2004 год. Библия JavaScript, 5-е издание. Wiley Publishing, Inc., Индианаполис, США. Глава 33, Функции и настраиваемые объекты, с.987. ISBN  0-7645-5743-2
  17. ^ https://www.lua.org/pil/16.html
  18. ^ msdn. «PowerShell: об автоматических переменных». docs.microsoft.com. Получено 2018-03-22.
  19. ^ msdn. "about_Classes". docs.microsoft.com. Получено 2018-12-17.
  20. ^ Объединение типов и классов в Python 2.2, Гвидо ван Россум, "Переопределение метода __new__ "

дальнейшее чтение

  • Мейерс, Скотт, 1995. Более эффективный C ++: 35 новых способов улучшить ваши программы и дизайн. ISBN  0-201-63371-X Скотт Мейерс
  • Страуструп, Бьярне, 1994. Дизайн и эволюция C ++. Аддисон-Уэсли Паб. Co. ISBN  0-201-54330-3 Бьярне Страуструп

внешняя ссылка