Rust на примерах — страница 23 из 65

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Видимость структуры

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

mod my {

// Публичная структура с публичным полем обобщённого типа `T`

pub struct OpenBox {

pub contents: T,

}

// Публичная структура с приватным полем обобщённого типа `T`

#[allow(dead_code)]

pub struct ClosedBox {

contents: T,

}

impl ClosedBox {

// Публичный конструктор

pub fn new(contents: T) -> ClosedBox {

ClosedBox {

contents: contents,

}

}

}

}

fn main() {

// Публичная структура с публичным полем может быть создана, как обычно

let open_box = my::OpenBox { contents: "публичную информацию" };

// а их поля доступны всем.

println!("Открытая упаковка хранит: {}", open_box.contents);

// Публичные структуры с приватными полями не могут быть созданы, используя имя полей

// Ошибка! `ClosedBox` имеет приватные поля

//let closed_box = my::ClosedBox { contents: "классифицированную информацию" };

// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку

// Однако, структуры с приватными полями могут быть созданы с помощью

// публичного конструктора

let _closed_box = my::ClosedBox::new("классифицированную информацию");

// нельзя получить доступ к приватным полям публичных структур.

// Ошибка! Поле `contents` приватное

//println!("Закрытая упаковка хранит: {}", _closed_box.contents);

// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

generics и методы

Декларацияuse

Декларация use используется, чтобы связать полный путь с новым именем, что упрощает доступ.

// extern crate deeply; // обычно эта строка есть и она не закомментирована!

use crate::deeply::nested::{

my_first_function,

my_second_function,

AndATraitType

};

fn main() {

my_first_function();

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Вы можете использовать ключевое слово as, что импортировать сущности и функции под другим именем:

// Привязать путь `deeply::nested::function` к `other_function`.

use deeply::nested::function as other_function;

fn function() {

println!("вызвана `function()`");

}

mod deeply {

pub mod nested {

pub fn function() {

println!("вызвана `deeply::nested::function()`")

}

}

}

fn main() {

// Упрощённый доступ к `deeply::nested::function`

other_function();

println!("Entering block");

{

// Эквивалентно `use deeply::nested::function as function`.

// `function()` затенение собой внешнюю функцию.

use deeply::nested::function;

function();

// у привязок `use` локальная область видимости. В данном случае

// внешняя `function()` затенена только в этом блоке.

println!("Leaving block");

}

function();

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

superиself

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

fn function() {

println!("вызвана `function()`");

}

mod cool {

pub fn function() {

println!("called `cool::function()`");

}

}

mod my {

fn function() {

println!("вызвана `my::function()`");

}

mod cool {

pub fn function() {

println!("вызвана `my::cool::function()`");

}

}

pub fn indirect_call() {

// Давайте вызовем  все функции под названием `function` в этой области видимости!

print!("вызвана `my::indirect_call()`, с помощью которой\n