Задать вопрос
@historydev
Mistkerl, drück den Knopf.

Что такое связывание, объявление, инициализация и определение?

Объявление (Declaration) - вводит имя переменной в область видимости.
let x: u8;
fn f(x: u8);

Связывание (Binding) — связывает имя с чем-то (значением, шаблоном, параметром).
let x: u8 = 123; // можно трактовать по разному: связывание, инициализация, определение
fn f(x: u8); // x привязывается к значению при вызове, как я понял

Инициализация (Initialization) - впервые присваивает значение переменной.
let x: u8 = 123;
let x: u8;
x = 123;

Определение (Definition) - объявление и инициализация.
let x: u8 = 123;
fn f(x: u8) { /* Something */ };


Например:
let x: u8; // Объявление
x = 123; // Связывание и инициализация
let x = 123; // Связывание и определение

fn f(x: u8) {}  // Связывание и определение
fn f() {} // Определение


Я не могу найти однозначных определений каждого из терминов, отсюда много вопросов.

Определение переменной и определение функции разные вещи, функция не может быть инициализирована, тогда почему это называют определением, если определение это "объявление и инициализация"?

Вот похожие вопросы, которые дают некоторые ответы для cpp с некоторой исчерпывающий информацией из стандарта:
https://stackoverflow.com/questions/23345554/what-...
https://stackoverflow.com/questions/1410563/what-i...

Какая-то чушь получается, люди называют вещи как им хочется и путают других.
- Это хорошо иллюстрируют функции, технически параметрами называются элементы в скобках при определении fn f(x: u8), а аргументами элементы в скобках при вызове f(255);, однако люди используют их взаимозаменяемо.
  • Вопрос задан
  • 124 просмотра
Подписаться 1 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka Куратор тега Rust
Точные определения будут только в стандарте или спецификации на конкретный язык.

Ну и термин вполне может состоять из двух слов.


Какая-то чушь получается, люди называют вещи как им хочется и путают других.
- Это хорошо иллюстрируют функции, технически параметрами называются элементы в скобках при определении fn f(x: u8), а аргументами элементы в скобках при вызове f(255);, однако люди используют их взаимозаменяемо.

Добро пожаловать в реальный мир, где люди жонглируют словами так, как им удобно, пока это не несёт никаких рисков из-за неоднозначности.

Что реально изменяется от того, как я назову штуки в скобочках?)

https://doc.rust-lang.org/reference/items/function...

https://doc.rust-lang.org/reference/expressions/ca...

По спеке и то и другое - параметры.

А теперь каждый пункт по порядку:

Объявление (Declaration) - вводит имя переменной в область видимости.

то что с let - это variable declaration
https://doc.rust-lang.org/reference/statements.htm...

То что с fn - это function declaration.


Связывание (Binding) — связывает имя с чем-то (значением, шаблоном, параметром).


let x: u8 = 123; // можно трактовать по разному: связывание, инициализация, определение

Конкретно тут - это declaration with initializer expression, вполне однозначно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы