Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Язык программирования Rust (https://javascript.ru/forum/offtopic/52727-yazyk-programmirovaniya-rust.html)

kobezzza 03.06.2015 21:02

Цитата:

Сообщение от Erolast (Сообщение 373734)
kobezzza, это опять foo, если что)

Да, уже понял :) Модеры, забаньте его поскорее :)

Safort 03.06.2015 23:52

kobezzza,
Цитата:

Модеры, забаньте его поскорее
уже.

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

pornoborets 07.06.2015 13:59

Цитата:

Сообщение от indeterm (Сообщение 373735)
Вот это говно чтоли ты называешь ООП?
trait Animal {
    // Static method signature; `Self` refers to the implementor type
    fn new(name: &'static str) -> Self;

    // Instance methods, only signatures
    fn name(&self) -> &'static str;
    fn noise(&self) -> &'static str;

    // A trait can provide default method definitions
    fn talk(&self) {
        // These definitions can access other methods declared in the same
        // trait
        println!("{} says {}", self.name(), self.noise());
    }
}

struct Dog { name: &'static str }

impl Dog {
    fn wag_tail(&self) {
        println!("{} wags tail", self.name);
    }
}

// Implement the `Animal` trait for `Dog`
impl Animal for Dog {
    // Replace `Self` with the implementor type: `Dog`
    fn new(name: &'static str) -> Dog {
        Dog { name: name }
    }

    fn name(&self) -> &'static str {
        self.name
    }

    fn noise(&self) -> &'static str {
        "woof!"
    }

    // Default trait methods can be overridden
    fn talk(&self) {
        // Traits methods can access the implementor methods
        self.wag_tail();

        println!("{} says {}", self.name, self.noise());
    }
}

struct Sheep { naked: bool, name: &'static str }

impl Sheep {
    fn is_naked(&self) -> bool {
        self.naked
    }

    fn shear(&mut self) {
        if self.is_naked() {
            // Implementor methods can use the implementor's trait methods
            println!("{} is already naked!", self.name());
        } else {
            println!("{} gets a haircut", self.name);

            self.talk();
            self.naked = true;
        }
    }
}

impl Animal for 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() {
            "baaah"
        } else {
            "baaaaaaaaaaaah"
        }
    }
}

fn main() {
    // Type annotation is necessary in this case
    let mut dolly: Sheep = Animal::new("Dolly");
    let spike: Dog = Animal::new("Spike");
    // TODO ^ Try removing the type annotations

    dolly.shear();

    spike.talk();
    dolly.talk();
}

На *языке программирования* это выглядело бы примерно так:
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 07.06.2015 14:08

Цитата:

Сообщение от Safort
Я в Расте пока не продолжал разбираться, но на первый взгляд там довольно удобное ООП. Просто оно немного непривычное.

Почитал Ваши посты в треде. Это весьма странно выглядит: Вы вовсю пиарите язык, с которым толком даже не ознакомились.

Safort 07.06.2015 17:56

pornoborets,
а что, плохое знание языка должно как-то мешать мне пиарить его?)

Safort 25.06.2015 21:24

Rust 1.1 stable, the Community Subteam, and RustCamp

kobezzza 13.07.2015 23:49

https://github.com/oakes/SolidOak

kobezzza 14.07.2015 01:27

Пишем свой упрощенный OpenGL на Rust — часть 1 (рисуем линию)

Safort 14.07.2015 10:13

kobezzza,
уже есть вторая часть http://habrahabr.ru/post/261739/

jackdempsey2015 14.07.2015 13:54

Цитата:

после всех мучений, у меня наконец получился проект, который вы можете увидеть в снапшоте на github.
Получившийся "проект" -- это два квадратика. Отличная реклама языку.

kobezzza 24.07.2015 21:45

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

// Наша функция принимает 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 24.07.2015 22:06

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

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

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

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

novikov 26.07.2015 00:51

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

Там используется Arc<T> и Mutex<T>. Это контейнеры. Помещённые в них значения произвольного типа приобретают дополнительные свойства при многозадачном исполнении. Определяют правила предоставления ресурсов конкурирующим процессам.

kobezzza 26.07.2015 10:05

Цитата:

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

Там используется Arc<T> и Mutex<T>. Это контейнеры. Помещённые в них значения произвольного типа приобретают дополнительные свойства при многозадачном исполнении. Определяют правила предоставления ресурсов конкурирующим процессам.

Спасибо, эту то статья я как раз и пропустил.

novikov 04.08.2015 14:45

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

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

novikov 04.08.2015 15:12

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.