Цитата:
|
kobezzza,
Цитата:
Я в Расте пока не продолжал разбираться, но на первый взгляд там довольно удобное ООП. Просто оно немного непривычное. |
Цитата:
Animal := Object clone do( name ::= "" talk := method((name .. " says " .. noise) println) ) Dog := Animal clone do(noise := "woof") Sheep := Animal clone do( naked ::= false shear := method( if(naked, (name .. " is already naked") println, (name .. " gets a haircut") println) ) noise := method( if(naked, "baaah", "baaaaaaaaaaah") ) ) spike := Dog clone setName("Spike") dolly := Sheep clone setName("Dolly") spike talk dolly talk dolly shear |
Цитата:
|
pornoborets,
а что, плохое знание языка должно как-то мешать мне пиарить его?) |
|
|
|
kobezzza,
уже есть вторая часть http://habrahabr.ru/post/261739/ |
Цитата:
|
Разбирался со временами жизни указателей, в итоге понял написав такой код:
// Наша функция принимает 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. |
Разбираюсь с видами указателей, но не нашёл в учебнике внятного описания, а по доке пока не въезжаю:
Arc<T> RefCell<T> Cell<T> Box<T> Мб кто уже разобрался? Ну или я напишу ответ, когда разберусь :) UPD: http://habrahabr.ru/post/191916/ хотя статья мега древняя и скорее всего уже протухла :( |
В Книге есть пример про обедающих философов.
Там используется Arc<T> и Mutex<T>. Это контейнеры. Помещённые в них значения произвольного типа приобретают дополнительные свойства при многозадачном исполнении. Определяют правила предоставления ресурсов конкурирующим процессам. |
Цитата:
|
Нeдавно использовал Cell<T>. Хотел внедрить счётчик в две фабрики, чтобы ограничить общее количество создаваемых ими экземпляров. Сначала пошёл на поводу у компилятора, который ругался, что счётчик неизменяемый. А сделаешь его изменяемым натыкаешься на ограничение но количеству изменяемых ссылок (допускается только одна). Получается, одна фабрика работает, а добавишь вторую - ошибка. Пытался обернуть структуру счётчика и в RefCell и в Cell. Не вышло по причине, что синтаксис становился каким-то сложным и нерабочим. Выход - применить Cell не ко всему счётчику, а только к одному меняющемуся полю. Появилось понятие "внутренняя изменяемость". Код демо-проекта есть на GitHub. Рекомендуют предпочесть Cell в противовес RefCell, так как RefCell приводит к выполнению дополнительных действий при исполнении программы и может вызвать панику.
https://doc.rust-lang.org/std/cell/ |
Box<T> отправляет переменную в кучу.
let mut a1 = Box::new(Alien{ planet: "Mars".to_string(), n_tentacles: 4 }); println!("{}", a1.n_tentacles); // 4 пример из книги Essential Rust |
Часовой пояс GMT +3, время: 20:07. |