XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Static
'static - наибольшее возможное время жизни и длится в течение всей жизни работающей программы. 'static может быть приведено к более короткому времени жизни. Есть два способа сделать переменную со временем жизни 'static и в результате обоих способов, переменная хранится в неизменяемой памяти бинарного файла:
• Создание константы с ключевым словом static.
• Создание строкового литерала, имеющего тип &'static str.
Рассмотрим следующий пример, который показывает оба метода:
// Создадим константу со временем жизни `'static`.
static NUM: i32 = 18;
// Вернём ссылку на `NUM`, у которой собственное время жизни `'static`
// приводится ко времени жизни аргумента.
fn coerce_static<'a>(_: &'a i32) ->&'a i32 {
&NUM
}
fn main() {
{
// Создадим *строковый* литерал и выведем его:
let static_string = "Я в неизменяемой памяти";
println!("static_string: {}", static_string);
// Когда `static_string` выходит из области видимости, ссылка
// на неё больше не может быть использована, но данные остаются в бинарном файле.
}
{
// Создадим число для использования в `coerce_static`:
let lifetime_num = 9;
// Приведём `NUM` ко времени жизни `lifetime_num`:
let coerced_static = coerce_static(&lifetime_num);
println!("coerced_static: {}", coerced_static);
}
println!("NUM: {} остаётся доступным!", NUM);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Смотрите также:
'static константы
Сокрытие
Некоторые шаблоны времён жизни достаточно общие и поэтому анализатор заимствований может позволить вам опустить их чтобы ускорить написание кода и увеличить его читаемость. Это известно как сокрытие времён жизни. Сокрытие появилось в Rust, исключительно из-за того, что они применяются к общим шаблонам.
Следующий код показывает несколько примеров сокрытия. Для более полного описания сокрытия, обратитесь к главе про [a0}сокрытие времён жизни в TRPL.
// По существу, `elided_input` и `annotated_input` имеют одинаковую сигнатуру
// потому что время жизни `elided_input` выводится компилятором:
fn elided_input(x: &i32) {
println!("`elided_input`: {}", x);
}
fn annotated_input<'a>(x: &'a i32) {
println!("`annotated_input`: {}", x);
}
// Аналогично, `elided_pass` и `annotated_pass` имеют идентичные сигнатуры
// потому что время жизни неявно добавлено к `elided_pass`:
fn elided_pass(x: &i32) ->&i32 { x }
fn annotated_pass<'a>(x: &'a i32) ->&'a i32 { x }
fn main() {
let x = 3;
elided_input(&x);
annotated_input(&x);
println!("`elided_pass`: {}", elided_pass(&x));
println!("`annotated_pass`: {}", annotated_pass(&x));
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Смотрите также:
сокрытие
Типажи (трейты)
Типаж (trait, трейт) - это набор методов, определённых для неизвестного типа: Self. Они могут получать доступ к другим методам, которые были объявлены в том же типаже.
Типажи могут быть реализованы для любых типов данных. В примере ниже, мы определили группу методов Animal. Типаж Animal реализован для типа данных Sheep, что позволяет использовать методы из Animal внутри Sheep.
struct Sheep { naked: bool, name: &'static str }
trait Animal {
// Сигнатура статического метода, `Self` ссылается на реализующий тип.
fn new(name: &'static str) -> Self;
// Сигнатура метода экземпляра; они возвращают строки.
fn name(&self) ->&'static str;
fn noise(&self) ->&'static str;
// Типаж может содержать определение метода по умолчанию
fn talk(&self) {
println!("{} говорит {}", self.name(), self.noise());
}
}
impl Sheep {
fn is_naked(&self) -> bool {
self.naked
}
fn shear(&mut self) {
if self.is_naked() {
// Методы типа могут использовать методы типажа, реализованного для этого типа.
println!("{} уже без волос...", self.name());
} else {
println!("{} подстригается!", self.name);
self.naked = true;
}
}
}
// Реализуем типаж `Animal` для `Sheep`.
impl Animal for Sheep {
// `Self` реализующий тип: `Sheep`.
fn new(name: &'static str) -> Sheep {
Sheep { name: name, naked: false }
}
fn name(&self) ->&'static str {
self.name
}
fn noise(&self) ->&'static str {
if self.is_naked() {
"baaaaah?"
} else {
"baaaaah!"
}
}
// Методы по умолчанию могут быть переопределены.
fn talk(&self) {
// Например, мы добавили немного спокойного миросозерцания...
println!("{} делает паузу... {}", self.name, self.noise());
}
}
fn main() {
// Аннотация типа в данном случае необходима.