stringtranslate.com

Введите подпись

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

Примеры

С/С++

В 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 xf :: a -> b -> cf2 :: b -> cf2 bc

Спецификации фактического типа могут состоять из фактического типа, например Integer, или переменной общего типа , которая используется в параметрических полиморфных функциях , например a, или b, или anyType. Итак, мы можем написать что-то вроде:functionName :: a -> a -> ... -> a

Поскольку Haskell поддерживает функции высшего порядка , функции можно передавать в качестве аргументов. Это написано как:functionName :: (a -> a) -> a

Эта функция принимает функцию с сигнатурой типа и возвращает данные типа out.a -> aa

Джава

В виртуальной машине 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()содержит три модификатора:

Подпись

Сигнатура функции состоит из прототипа функции. Он определяет общую информацию о функции, такую ​​как имя, область действия и параметры. Многие языки программирования используют искажение имен , чтобы передать больше семантической информации от компиляторов компоновщикам. Помимо искажений, в сигнатуре функции (хранящейся внутри большинства компиляторов) содержится избыток информации, которая недоступна, но к ней можно получить доступ. [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, который является супертипом всех типов. Идиоматично указывать типы аргументов, но не тип возвращаемого значения.

Цель-C

В языке программирования Objective-C сигнатуры методов объекта объявляются в файле заголовка интерфейса. Например,

-  ( id ) initWithInt: ( int ) значение ;

определяет метод initWithInt, который возвращает общий объект (an id) и принимает один целочисленный аргумент. Objective-C требует, чтобы тип в сигнатуре был явным, только если тип не является явным id; эта подпись эквивалентна:

-  initWithInt: ( int ) значение ;

Ржавчина

В Rust сигнатуры функций имеют следующий вид:

 комиссия fn ( продажа : u32 , ставка : f64 ) -> f64 ;  

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

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

  1. ^ «Справочное руководство пользователя Erlang, версия 13.1.4» . erlang.org . 7.5 Характеристики функций. Архивировано из оригинала 27 января 2023 г. Проверено 27 апреля 2023 г.
  2. ^ «Справочник по C++: Термины программирования» . Проверено 3 декабря 2013 г.
  3. ^ Пол Лихи. «Сигнатура метода». Руководство About.com . Проверено 31 мая 2011 г. Сигнатура метода является частью объявления метода. Это комбинация имени метода и списка параметров.
  4. ^ Мессенбёк, Ханспетер (25 марта 2002 г.). «Расширенный C#: переменное количество параметров» (PDF) . Институт системного программного обеспечения, Университет Иоганна Кеплера в Линце, Факультет информатики. п. 52 . Проверено 3 августа 2011 г.
  5. ^ «Глава 4. Формат файла класса» . docs.oracle.com . Проверено 17 октября 2021 г.