Search
Write a publication
Pull to refresh
12
0
Андрей Алексеев @iKintosh

Lead Data Scientist

Send message

Погодите. Но как раз таки даст. Если вы описываете владение таким образом, то чем это отличается от GC?

@andreymal привел отличные примеры. Также могут быть вызваны memory leaks. Если наша функция аллоцирует память, но раз мы не освобождаем s, то логично, что не должны освобождать и другие переменные. А чекать, что s пришла извне и ее надо сохранить, а остальные не следует, может быть довольно затратно особенно когда мы подключаем async, пойнтеры и ТД. Плюс мы не сможем так просто параллелить компиляцию и как будто в таком случае проще воспользоваться GC-языками. Ну и хочется явно видеть, что функция делает.

В данном конкретном случае без понятия, но dangling pointer все ещё является большим источником проблем. Механизм lifetime это в том числе попытка его полностью исключить.

Это принцип работы borrow checker. Если владение будет передаваться неявно, то для компилятора может стать проблемой вычислять какой области видимости принадлежит переменная особенно в async. Если хочется добиться логики которую вы описали, то следует явно передавать ссылки на значения:

fn main() {
    let mut c = "str".to_string();
    f1(&mut c);
    f2(c);
}


fn f1(c: &mut String) {}
fn f2(c: String) {}

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

Привет, вот ссылка https://t.me/etna_support

Извините, но не могу не спросить, а какие темы должны, по вашему мнению, раскрываться в подобной статье? Мне действительно интересно.

Information

Rating
9,147-th
Location
Москва, Москва и Московская обл., Россия
Works in
Date of birth
Registered
Activity

Specialization

Data Scientist
Middle
Python
Git
OOP
Docker