В информатике сигнатура типа или аннотация типа определяют входные и выходные данные функции , подпрограммы или метода . Сигнатура типа включает количество, типы и порядок аргументов функции . Одним из важных применений сигнатуры типа является разрешение перегрузки функции , когда одно конкретное определение вызываемой функции выбирается среди множества перегруженных форм.
В C и C++ сигнатура типа объявляется с помощью так называемого прототипа функции . В C/C++ объявление функции отражает ее использование ; например, указатель на функцию с сигнатурой будет называться так:(int)(char, double)
чар с ; двойной д ; int retVal = ( * fPtr ) ( c , d );
В Erlang сигнатуры типов могут быть объявлены опционально, например: [1]
— спецификация имя_функции ( type1 (), type2 (), ...) -> out_type ().
Например:
- спецификация is_even ( число ())) -> логическое значение ().
Сигнатура типа в Haskell обычно имеет следующую форму:
имя_функции :: 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
Эта функция принимает функцию с сигнатурой типа и возвращает данные типа out.a -> a
a
В виртуальной машине Java внутренние сигнатуры типов используются для идентификации методов и классов на уровне кода виртуальной машины.
Пример: метод представлен в байт-коде как .String String.substring(int, int)
Ljava/lang/String.substring(II)Ljava/lang/String;
Сигнатура метода main
выглядит так:
public static void main ( String [] args );
А в дизассемблированном байт-коде он принимает видLsome/package/Main/main:([Ljava/lang/String;)V
Сигнатура метода main()
содержит три модификатора:
public
указывает, что метод может быть вызван любым объектом.main()
static
указывает, что метод является методом класса.main()
void
указывает, что метод не имеет возвращаемого значения.main()
Сигнатура функции состоит из прототипа функции. Он определяет общую информацию о функции, такую как имя, область действия и параметры. Многие языки программирования используют искажение имен , чтобы передать больше семантической информации от компиляторов компоновщикам. Помимо искажений, в сигнатуре функции (хранящейся внутри большинства компиляторов) содержится избыток информации, которая недоступна, но к ней можно получить доступ. [2]
Понимание понятия сигнатуры функции является важной концепцией для всех исследований в области информатики.
Практика множественного наследования требует учета сигнатур функций, чтобы избежать непредсказуемых результатов.
Теория информатики и, в частности, концепция полиморфизма широко используют концепцию сигнатуры функции.
В языке программирования C сигнатура примерно эквивалентна определению ее прототипа .
Термин «подпись» может иметь и другие значения в информатике:
В компьютерном программировании , особенно в объектно-ориентированном программировании , метод обычно идентифицируется по его уникальной сигнатуре метода , которая обычно включает имя метода, а также количество, типы и порядок его параметров . [3] Сигнатура метода — это наименьший тип метода.
В C/C++ сигнатурой метода является имя метода, а также количество и тип его параметров, но можно иметь последний параметр, состоящий из массива значений:
int printf ( const char * , ... );
Манипулировать этими параметрами можно с помощью подпрограмм в заголовке стандартной библиотеки .<stdarg.h>
В C++ тип возвращаемого значения также может следовать за списком параметров, который называется конечным типом возвращаемого значения . Разница только синтаксическая; в любом случае результирующая подпись идентична:
auto printf ( const char * ... ) -> int ;
Подобно синтаксису C, сигнатуры методов в C# состоят из имени, количества и типа его параметров, где последний параметр может быть массивом значений: [4]
void Add ( out int sum , params int [] value ); [...] Добавить ( выходная сумма , 3 , 5 , 7 , 11 , - 1 ); // сумма == 25
В Java сигнатура метода состоит из имени, количества, типа и порядка его параметров. Типы возвращаемых значений и выданные исключения не считаются частью сигнатуры метода, равно как и имена параметров; они игнорируются компилятором для проверки уникальности метода.
Сигнатуры методов помогают различать перегруженные методы (методы с одинаковыми именами) в классе. Типы возвращаемых значений не включаются в перегрузку. Для различения перегруженных методов следует использовать только сигнатуры методов. [5]
Например, следующие два метода имеют разные сигнатуры:
void doSomething ( String [] x ); // doSomething(String[]) void doSomething ( String x ); // сделатьЧто-то(Строка)
Следующие два метода имеют одинаковую сигнатуру:
int doSomething ( int x ); // doSomething(int) void doSomething ( int y ) выдает исключение ; // сделать что-то (целое)
В 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 ;
Сигнатура метода является частью объявления метода.
Это комбинация имени метода и списка параметров.