Что такое прототип функции в Rust? - PullRequest
0 голосов
/ 10 января 2019

Я хотел понять поведение атрибута #[inline] в Rust, поэтому я просматривал раздел Атрибуты Справочника по Rust . Это было очень полезно, но я нашел эту часть описания запутанной (выделение мое):

Атрибут inline предлагает компилятору поместить копию вызываемой функции в вызывающую сторону, а не генерировать код для вызова функции, где она определена.

Этот атрибут может использоваться в функциях и прототипах функций, хотя он ничего не делает с прототипами функций.

Это предостережение повторяется для атрибута #[cold].

Я никогда не слышал термин "прототип функции", используемый в отношении Rust. Я знаю, что такая концепция существует в JavaScript, но системы объектов и типов JavaScript и Rust сильно отличаются! Что это значит здесь?

Продолжая поиск, я нашел два упоминания о прототипах функций в Индекс ошибок :

E0034

Компилятор не знает, какой метод вызывать, потому что несколько методов имеют один и тот же прототип.

E0580

Функция main была объявлена ​​неправильно. Прототип функции main никогда не должен принимать аргументы.

В этом случае «прототип функции» означает нечто вроде «сигнатуры функции» - имена, аргументы и типы, составляющие внешний интерфейс функции. Похоже, что это также , что это означает в контексте C / C ++ . Тем не менее, это не похоже на использование выше; каждое определение функции начинается с сигнатуры функции, поэтому не имеет смысла говорить, что размещение атрибута в сигнатуре ничего не делает, потому что это то, что вы делаете, когда ставите атрибут в функцию.

Что означает термин «прототип функции» в контексте Rust?

1 Ответ

0 голосов
/ 10 января 2019

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

Да, каждая функция начинается с сигнатуры, но не каждая сигнатура является частью определения функции. То есть можно иметь подпись, но не иметь тела (например, в признаке), и именно это подразумевается под «прототипом» в приведенной вами документации. Как то так:

trait Foo {
    #[inline] // This annotation does nothing
    fn foo();
}
...