stringtranslate.com

Тип подписи

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

Примеры

С/С++

В 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 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выглядит так: [2]

public static void main ( String [] args );    

А в дизассемблированном байт-коде он принимает видLsome/package/Main/main:([Ljava/lang/String;)V

Сигнатура метода 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

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

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

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

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

Ржавчина

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

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

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

Ссылки

  1. ^ "Erlang Reference Manual User's Guide Version 13.1.4". erlang.org . 7.5 Спецификации функций. Архивировано из оригинала 2023-01-27 . Получено 2023-04-27 .
  2. ^ "Подпись (функции) - Глоссарий MDN Web Docs: Определения терминов, связанных с Интернетом | MDN". developer.mozilla.org . 2023-06-08 . Получено 2024-07-05 .
  3. ^ "Справочник C++: Термины программирования" . Получено 3 декабря 2013 г.
  4. ^ Пол Лихи. "Сигнатура метода". About.com Guide . Получено 2011-05-31 . Сигнатура метода является частью объявления метода. Это комбинация имени метода и списка параметров.
  5. ^ Мессенбёк, Ханспетер (25 марта 2002 г.). «Расширенный C#: переменное количество параметров» (PDF) . Институт системного программного обеспечения, Университет Иоганна Кеплера в Линце, Факультет информатики. п. 52 . Проверено 3 августа 2011 г.
  6. ^ "Глава 4. Формат файла класса". docs.oracle.com . Получено 17.10.2021 .