Ссылки и Ownership

Контекст/область видимости

Последнее обновление: 14.04.2021

Для каждого значения имеется свой констекст или область видимости (scope), в рамках которой мы можем использовать данное значение. Как определяется контекст/область видимости? Обычно границами области видимости служат фигурные скобки {}, которые определяют блок кода - открывающая фигурная скобка определяет начало контекста, а закрывающая - конец контекста. Соответственно циклы и условные конструкции, функции и анонимные блоки кода образуют отдельную область видимости. Также есть глобальная область видимости - вне функции main, однако в этой обасти видимости можно определять только константы.

Объект, который определено в рамках какой-то области видимости, вне этой области видимости мы использовать не можем. Например:

fn main(){

	{					// здесь переменная n еще не определена, ее нельзя использовать
		let n = 5;		// n определена и инициализирована, далее ее можно использовать
		println!("n = {} ", n);
	}					// окончание области видимости переменной n
	
	// println!("n = {} ", n);	// ! Ошибка - здесь переменная n уже не существует
}

Здесь переменная n определена в анонимном блоке кода, который ограничен фигурными скобками:

{					// начало области видимости переменой n
	let n = 5;		// n определена и инициализирована, далее ее можно использовать
	println!("n = {} ", n);
}					// конец области видимости переменной n

После определения и инициализации переменной n мы можем ее использовать вплоть до окончания ее контекста - закрывающей фигурной скобки анонимного блока.

После завершения контекста (закрывающей фигурной скобки) значение переменной удаляется, и ее мы больше не можем использовать.

Объекты могут использоваться во вложенных контекстах, но не во внешних. Например:

const A: i32 = 11;	// константа A доступна в любой функции в данном файле

fn main(){
	let x = 22;	// далее переменная x доступна в любой части функции main
	
	{						// начало области видимости блока
		let n = 33;			// далее переменная n доступна в любой части анонимного блока
		println!("n={}", n);
		println!("x={}", x);
		println!("A={}", A);
	}				// далее переменную n нельзя использовать
	
	//println!("n={}", n);	// ! Ошибка
}	// далее переменную x нельзя использовать

Здесь константа A определена в глобальной области видимости, поэтому она доступна в любой функции, определенной в том же файле, в том числе в любом месте функции main.

Переменная x, определенная в функции main, имеет в качестве области видимости - функцию main. Поэтому ее значение может использоваться в любом месте функции с момента инициализации переменной до конца функции, в том числе во вложенном в функцию анонимном блоке.

Переменная n, определенная в анонимном блоке, имеет в качестве области видимости данный анонимный блок. Поэтому ее значение может применяться в любом месте анонимного блока с момента инициализации переменной до конца блока.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850