Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #51 (permalink)  
Старый 24.07.2015, 21:45
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Разбирался со временами жизни указателей, в итоге понял написав такой код:

// Наша функция принимает 2 параметра-ссылки типа int32
// и возвращает кортеж из этих значений, причём первое значение будет увеличено на 1
fn foo<'a, 'b>(i: &'a mut i32, j: &'b i32) -> (&'a i32, &'b i32) {
    *i += 1;
    (i, j)
}

fn main() {
    let mut x1 = 5;
    let res;

    {
        // Сохраняем в res значение .0
        res = foo(&mut x1, &mut 3).0;
    }

    // Всё ок, 6, т.к. время жизни первого параметра foo совпадает с x1,
    // а вот элемент .1 мы бы не смогли сохранить, т.к. его время жизни другое
    // и он удалится из памяти при выходе из блока 20-23
    println!("{}", res);
}


Думаю, будет полезно изучающим Rust.
__________________
kobezzza
code monkey
Ответить с цитированием
  #52 (permalink)  
Старый 24.07.2015, 22:06
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Разбираюсь с видами указателей, но не нашёл в учебнике внятного описания, а по доке пока не въезжаю:

Arc<T>
RefCell<T>
Cell<T>
Box<T>

Мб кто уже разобрался? Ну или я напишу ответ, когда разберусь

UPD: http://habrahabr.ru/post/191916/ хотя статья мега древняя и скорее всего уже протухла
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 24.07.2015 в 22:09.
Ответить с цитированием
  #53 (permalink)  
Старый 26.07.2015, 00:51
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 19.11.2012
Сообщений: 178

В Книге есть пример про обедающих философов.

Там используется Arc<T> и Mutex<T>. Это контейнеры. Помещённые в них значения произвольного типа приобретают дополнительные свойства при многозадачном исполнении. Определяют правила предоставления ресурсов конкурирующим процессам.
Ответить с цитированием
  #54 (permalink)  
Старый 26.07.2015, 10:05
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от novikov Посмотреть сообщение
В Книге есть пример про обедающих философов.

Там используется Arc<T> и Mutex<T>. Это контейнеры. Помещённые в них значения произвольного типа приобретают дополнительные свойства при многозадачном исполнении. Определяют правила предоставления ресурсов конкурирующим процессам.
Спасибо, эту то статья я как раз и пропустил.
__________________
kobezzza
code monkey
Ответить с цитированием
  #55 (permalink)  
Старый 04.08.2015, 14:45
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 19.11.2012
Сообщений: 178

Нeдавно использовал Cell<T>. Хотел внедрить счётчик в две фабрики, чтобы ограничить общее количество создаваемых ими экземпляров. Сначала пошёл на поводу у компилятора, который ругался, что счётчик неизменяемый. А сделаешь его изменяемым натыкаешься на ограничение но количеству изменяемых ссылок (допускается только одна). Получается, одна фабрика работает, а добавишь вторую - ошибка. Пытался обернуть структуру счётчика и в RefCell и в Cell. Не вышло по причине, что синтаксис становился каким-то сложным и нерабочим. Выход - применить Cell не ко всему счётчику, а только к одному меняющемуся полю. Появилось понятие "внутренняя изменяемость". Код демо-проекта есть на GitHub. Рекомендуют предпочесть Cell в противовес RefCell, так как RefCell приводит к выполнению дополнительных действий при исполнении программы и может вызвать панику.

https://doc.rust-lang.org/std/cell/

Последний раз редактировалось novikov, 04.08.2015 в 15:23.
Ответить с цитированием
  #56 (permalink)  
Старый 04.08.2015, 15:12
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 19.11.2012
Сообщений: 178

Box<T> отправляет переменную в кучу.

let mut a1 = Box::new(Alien{ planet: "Mars".to_string(), n_tentacles: 4 });
println!("{}", a1.n_tentacles); // 4


пример из книги Essential Rust

Последний раз редактировалось novikov, 04.08.2015 в 15:15.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Самый лучший язык программирования nemo Оффтопик 141 13.10.2013 01:29
Узнать используемый язык. riva Javascript под браузер 1 02.07.2013 21:54
язык веб-программирования будущего macdack Оффтопик 26 23.10.2012 01:50
Как развить мышление для программирования? Alex455 Оффтопик 37 12.07.2012 15:01
Новый язык программирования от Microsoft #F N_L Оффтопик 3 22.11.2009 10:24