Введите подпись
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
В информатике сигнатура типа или аннотация типа определяют входные и выходные данные функции , подпрограммы или метода . Сигнатура типа включает количество, типы функции и порядок аргументов . Одним из важных применений сигнатуры типа является разрешение перегрузки функции , когда одно конкретное определение вызываемой функции выбирается среди множества перегруженных форм.
Примеры
[ редактировать ]С/С++
[ редактировать ]В C и C++ сигнатура типа объявляется с помощью так называемого прототипа функции . В C/C++ объявление функции отражает ее использование ; например, указатель на функцию с сигнатурой (int)(char, double)
будет называться:
char c;
double d;
int retVal = (*fPtr)(c, d);
Эрланг
[ редактировать ]В Erlang сигнатуры типов могут быть объявлены опционально, например: [1]
-spec function_name(type1(), type2(), ...) -> out_type().
Например:
-spec is_even(number()) -> boolean().
Хаскелл
[ редактировать ]Сигнатура типа в Haskell обычно имеет следующую форму:
functionName :: arg1Type -> arg2Type -> ... -> argNType
Обратите внимание, что типом результата можно считать все, что находится за пределами первого предоставленного аргумента. Это следствие каррирования , которое стало возможным благодаря поддержке Haskell первоклассных функций ; эта функция требует двух входных данных, где предоставляется один аргумент, и функция «каррируется», чтобы создать функцию для не предоставленного аргумента. Таким образом, вызов f x
, где f :: a -> b -> c
, дает новую функцию f2 :: b -> c
это можно назвать f2 b
производить c
.
Спецификации фактического типа могут состоять из фактического типа, например Integer
или переменная общего типа , которая используется в параметрических полиморфных функциях , таких как a
, или b
, или anyType
. Итак, мы можем написать что-то вроде:
functionName :: a -> a -> ... -> a
Поскольку Haskell поддерживает функции высшего порядка , функции можно передавать в качестве аргументов. Это написано как:
functionName :: (a -> a) -> a
Эта функция принимает функцию с сигнатурой типа a -> a
и возвращает данные типа a
вне.
Ява
[ редактировать ]В виртуальной машине Java внутренние сигнатуры типов используются для идентификации методов и классов на уровне кода виртуальной машины.
Пример: метод String String.substring(int, int)
представлено в байт-коде как Ljava/lang/String.substring(II)Ljava/lang/String;
.
Подпись main
метод выглядит следующим образом: [2]
public static void main(String[] args);
А в дизассемблированном байт-коде он принимает вид Lsome/package/Main/main:([Ljava/lang/String;)V
Сигнатура метода для main()
метод содержит три модификатора:
public
указывает на то, чтоmain()
метод может быть вызван любым объектом.static
указывает на то, чтоmain()
метод является методом класса.void
указывает на то, чтоmain()
метод не имеет возвращаемого значения.
Подпись
[ редактировать ] этого раздела Тон или стиль могут не отражать энциклопедический тон , используемый в Википедии . ( Октябрь 2013 г. ) |
Сигнатура функции состоит из прототипа функции. Он определяет общую информацию о функции, такую как имя, область действия и параметры. Многие языки программирования используют искажение имен , чтобы передать больше семантической информации от компиляторов компоновщикам. Помимо искажений, в сигнатуре функции (хранящейся внутри большинства компиляторов) содержится избыток информации, которая недоступна, но к ней можно получить доступ. [3]
Понимание понятия сигнатуры функции является важной концепцией для всех исследований в области информатики.
- Современные методы объектной ориентации используют интерфейсы , которые по сути представляют собой шаблоны, созданные на основе сигнатур функций.
- В C++ используется перегрузка функций с различными сигнатурами.
Практика множественного наследования требует учета сигнатур функций, чтобы избежать непредсказуемых результатов. Теория информатики и, в частности, концепция полиморфизма широко используют концепцию сигнатуры функции.
В языке программирования C сигнатура примерно эквивалентна определению ее прототипа .
В ML семействе языков программирования «подпись» используется как ключевое слово, относящееся к конструкции модульной системы, играющей роль интерфейса .
Сигнатура метода
[ редактировать ]В компьютерном программировании , особенно в объектно-ориентированном программировании , метод обычно идентифицируется по его уникальной сигнатуре метода , которая обычно включает имя метода, а также количество, типы и порядок его параметров . [4] Сигнатура метода — это наименьший тип метода.
Примеры
[ редактировать ]С/С++
[ редактировать ]В C/C++ сигнатурой метода является имя метода, а также количество и тип его параметров, но можно иметь последний параметр, состоящий из массива значений:
int printf(const char*, ... );
Манипулировать этими параметрами можно с помощью процедур в заголовке стандартной библиотеки. <stdarg.h>
.
В C++ тип возвращаемого значения также может следовать за списком параметров, который называется конечным типом возвращаемого значения . Разница только синтаксическая; в любом случае результирующая подпись идентична:
auto printf(const char*... ) -> int;
С#
[ редактировать ]Подобно синтаксису C, сигнатуры методов в C# состоят из имени, количества и типа его параметров, где последний параметр может быть массивом значений: [5]
void Add(out int sum, params int[] value);
[...]
Add(out sum, 3, 5, 7, 11, -1); // sum == 25
Ява
[ редактировать ]В Java сигнатура метода состоит из имени, количества, типа и порядка его параметров. Типы возвращаемых значений и выданные исключения не считаются частью сигнатуры метода, равно как и имена параметров; они игнорируются компилятором для проверки уникальности метода.
Сигнатуры методов помогают различать перегруженные методы (методы с одинаковыми именами) в классе. Типы возвращаемых значений не включаются в перегрузку. Для различения перегруженных методов следует использовать только сигнатуры методов. [6]
Например, следующие два метода имеют разные сигнатуры:
void doSomething(String[] x); // doSomething(String[])
void doSomething(String x); // doSomething(String)
Следующие два метода имеют одинаковую сигнатуру:
int doSomething(int x); // doSomething(int)
void doSomething(int y) throws Exception; // doSomething(int)
Юлия
[ редактировать ]В Julia сигнатуры функций принимают следующий вид:
commission(sale::Int, rate::Float64)::Float64
Типы аргументов используются для множественной отправки . Тип возвращаемого значения проверяется, когда функция возвращает значение, и возникает исключение времени выполнения, если тип значения не соответствует указанному типу.
Абстрактные типы разрешены и поощряются для реализации общего поведения, общего для всех подтипов. Таким образом, приведенную выше функцию можно переписать следующим образом. В этом случае функция может принимать любые подтипы Integer и Real соответственно.
commission(sale::Integer, rate::Real)::Real
Типы в аргументах функции совершенно необязательны. Если он не указан, это эквивалентно использованию типа Any, который является супертипом всех типов. Идиоматично указывать типы аргументов, но не тип возвращаемого значения.
Цель-C
[ редактировать ]В языке программирования Objective-C сигнатуры методов объекта объявляются в файле заголовка интерфейса. Например,
- (id)initWithInt:(int)value;
определяет метод initWithInt
который возвращает общий объект ( id
) и принимает один целочисленный аргумент. Objective-C требует, чтобы тип в сигнатуре был явным, только если тип не указан. id
; эта подпись эквивалентна:
- initWithInt:(int)value;
Ржавчина
[ редактировать ]В Rust сигнатуры функций имеют следующий вид:
fn commission(sale: u32, rate: f64) -> f64;
См. также
[ редактировать ]- Аргумент функции – входные данные для математической функции.
Ссылки
[ редактировать ]- ^ «Справочное руководство пользователя Erlang, версия 13.1.4» . erlang.org . 7.5 Характеристики функций. Архивировано из оригинала 27 января 2023 г. Проверено 27 апреля 2023 г.
- ^ «Сигнатура (функции) — Глоссарий MDN Web Docs: Определения терминов, связанных с Интернетом | MDN» . http://developer.mozilla.org . 08.06.2023 . Проверено 5 июля 2024 г.
- ^ «Справочник по C++: Термины программирования» . Проверено 3 декабря 2013 г.
- ^ Пол Лихи. «Сигнатура метода» . Руководство About.com . Проверено 31 мая 2011 г.
Сигнатура метода является частью объявления метода. Это комбинация имени метода и списка параметров.
- ^ Мессенбёк, Ханспетер (25 марта 2002 г.). «Расширенный C#: переменное количество параметров» (PDF) . Институт системного программного обеспечения, Университет Иоганна Кеплера в Линце, факультет компьютерных наук. п. 52 . Проверено 3 августа 2011 г.
- ^ «Глава 4. Формат файла класса» . docs.oracle.com . Проверено 17 октября 2021 г.