В информатике сигнатура типа или аннотация типа определяет входы и выходы функции , подпрограммы или метода . Сигнатура типа включает число, типы и порядок аргументов функции . Одним из важных применений сигнатуры типа является разрешение перегрузки функций , когда одно конкретное определение вызываемой функции выбирается среди многих перегруженных форм.
В C и C++ сигнатура типа объявляется тем, что обычно называется прототипом функции . В C/C++ объявление функции отражает ее использование ; например, указатель функции с сигнатурой будет вызываться как:(int)(char, double)
char c ; double d ; int retVal = ( * fPtr )( c , d );
В Erlang сигнатуры типов могут быть опционально объявлены, как: [1]
- спец. имя_функции ( type1 (), type2 (), ...) -> out_type ().
Например:
- спецификация is_even ( число ()) -> логическое значение ().
Сигнатура типа в Haskell обычно имеет следующий вид:
ИмяФункции :: ТипАргумента1 -> ТипАргумента2 -> ... -> ТипАргументаN
Обратите внимание, что тип результата может рассматриваться как все, что находится после первого предоставленного аргумента. Это следствие каррирования , которое стало возможным благодаря поддержке 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
Эта функция принимает функцию с типом сигнатуры и возвращает данные типа out.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()
Сигнатура функции состоит из прототипа функции. Она определяет общую информацию о функции, такую как имя, область действия и параметры. Многие языки программирования используют искажение имени , чтобы передавать больше семантической информации от компиляторов к компоновщикам. В дополнение к искажению, в сигнатуре функции есть избыток информации (хранящейся внутри большинства компиляторов), которая не является легкодоступной, но к ней можно получить доступ. [3]
Понимание понятия сигнатуры функции является важной концепцией для всех исследований в области компьютерных наук.
Практика множественного наследования требует рассмотрения сигнатур функций, чтобы избежать непредсказуемых результатов. Теория компьютерных наук и, в частности, концепция полиморфизма широко используют концепцию сигнатуры функций.
В языке программирования 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 ); // сумма == 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 ) выдает исключение ; // doSomething(int)
В Julia сигнатуры функций имеют следующий вид:
комиссия ( продажа :: Int , ставка :: Float64 ) :: Float64
Типы в аргументах используются для множественной отправки . Тип возвращаемого значения проверяется, когда функция возвращает значение, и возникает исключение времени выполнения, если тип значения не соответствует указанному типу.
Абстрактные типы разрешены и поощряются для реализации общего поведения, которое является общим для всех подтипов. Таким образом, указанную выше функцию можно переписать следующим образом. В этом случае функция может принимать любые подтипы Integer и Real соответственно.
комиссия ( продажа :: Целое число , ставка :: Реальная ) :: Реальная
Типы полностью необязательны в аргументах функций. Если они не указаны, это эквивалентно использованию типа Any, который является супертипом всех типов. Идиоматично указывать типы аргументов, но не возвращаемый тип.
В языке программирования Objective-C сигнатуры методов для объекта объявляются в заголовочном файле интерфейса. Например,
- ( id ) initWithInt: ( int ) значение ;
определяет метод initWithInt
, который возвращает общий объект (an id
) и принимает один целочисленный аргумент. Objective-C требует, чтобы тип в сигнатуре был явным, только когда тип не является id
; эта сигнатура эквивалентна:
- initWithInt: ( int ) значение ;
В Rust сигнатуры функций имеют следующий вид:
комиссия fn ( продажа : u32 , ставка : f64 ) -> f64 ;
Сигнатура метода является частью объявления метода. Это комбинация имени метода и списка параметров.