Size: a a a

Rust — русскоговорящее сообществo

2020 March 26

DS

Dmytro Semenov in Rust — русскоговорящее сообществo
Привет сообщество. Изучаю Rust, имею Scala background. Имеется конкретный вопрос. немогу понять почему ругается borrow checker
источник

DS

Dmytro Semenov in Rust — русскоговорящее сообществo
fn iterative(root: &RefCell<TreeNode>, l: i32, r: i32) -> i32 {
   let mut stack = Vec::new();
   stack.push(root.borrow());
   let mut sum: i32 = 0;
   while let Some(node) = stack.pop() {
       if l <= node.val && node.val <= r {
           sum += node.val;
       }
       if node.val < l {
           match &node.left {
               Some(left) => {
                   let tmp: &RefCell<TreeNode> = left.borrow();
                   stack.push(tmp.borrow());
               }
               None => {}
           }
           //node.borrow().left.map(|left| stack.push(left));
       }
       if node.val > r {
           match &node.right {
               Some(right) => {
                   let tmp: &RefCell<TreeNode> = right.borrow();
                   stack.push(tmp.borrow())
               }
               None => {}
           }
           //node.borrow().right.map(|right| stack.push(&right));
       }
   }
   return sum;
}
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ссылка на ReCell?
источник

DS

Dmytro Semenov in Rust — русскоговорящее сообществo
вываливается с такой ошибкой
источник

DS

Dmytro Semenov in Rust — русскоговорящее сообществo
error[E0597]: `node` does not live long enough
 --> src/main.rs:76:24
  |
76 |                 match &node.right {
  |                        ^^^^ borrowed value does not live long enough
...
85 |         }
  |         - `node` dropped here while still borrowed
86 |         return sum;
87 |     }
  |     - borrow might be used here, when `stack` is dropped and runs the `Drop` code for type `std::vec::Vec`
  |
  = note: values in a scope are dropped in the opposite order they are defined

error: aborting due to previous error
источник

DS

Dmytro Semenov in Rust — русскоговорящее сообществo
pub struct TreeNode {
   pub val: i32,
   pub left: Option<Rc<RefCell<TreeNode>>>,
   pub right: Option<Rc<RefCell<TreeNode>>>,
}
источник

DS

Dmytro Semenov in Rust — русскоговорящее сообществo
@iccsf да по. всей видимости
источник

DS

Dmytro Semenov in Rust — русскоговорящее сообществo
еще и в Option завернута
источник

Э

Эрик in Rust — русскоговорящее сообществo
Вместо (*qwe).borrow() просто сразу отдавай qwe.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Вот тут match &node.right { перепиши на match node.right {.
источник

DS

Dmytro Semenov in Rust — русскоговорящее сообществo
тогда другая ошибка
источник

Э

Эрик in Rust — русскоговорящее сообществo
Какая?
источник

DS

Dmytro Semenov in Rust — русскоговорящее сообществo
error[E0507]: cannot move out of dereference of `std::cell::Ref<'_, TreeNode>`
 --> src/main.rs:66:23
  |
66 |                 match node.left {
  |                       ^^^^^^^^^ help: consider borrowing here: `&node.left`
67 |                     Some(left) => {
  |                          ----
  |                          |
  |                          data moved here
  |                          move occurs because `left` has type `std::rc::Rc<std::cell::RefCell<TreeNode>>`, which does not implement the `Copy` trait

error[E0597]: `left` does not live long enough
источник

Э

Эрик in Rust — русскоговорящее сообществo
let mut stack: Vec<&RefCell<_>> = Vec::new(); попробуй написать.
источник

DS

Dmytro Semenov in Rust — русскоговорящее сообществo
ок. спасибо попробую
источник
2020 March 27

SS

Stanislav Sagan in Rust — русскоговорящее сообществo
Использую diesel и diesel_migrations. Так вот, при компиляции все sql миграции просто оказываются в бинаре..

Это прям очень круто. Я совсем не ожидал такого поворота событий)) Захотелось с кем-то поделится)
источник

H

Hadji in Rust — русскоговорящее сообществo
Stanislav Sagan
Использую diesel и diesel_migrations. Так вот, при компиляции все sql миграции просто оказываются в бинаре..

Это прям очень круто. Я совсем не ожидал такого поворота событий)) Захотелось с кем-то поделится)
Позволь мне воспользоваться этим порывом и поспрашивать про дизель пару вопросов, если не против) Я ознакомился с доками diesel и rocket и вот какой вопрос не могу решить.

В рокет для простоты предлагают записать вот это в Rocket.toml:
[global.databases]
sqlite_logs = { url = "/path/to/database.sqlite" }


А в доках к diesel предлагается сделать так:
echo DATABASE_URL=postgres://username:password@localhost/diesel_demo > .env


Мне лично интересен постгрес, а не sqlite. Не подскажешь, как мне:
1) обойтись без дублирования
2) хранить url в БД не в .toml файле, который коммитится в репу
источник

H

Hadji in Rust — русскоговорящее сообществo
Я прям совсем начинающий, поэтому ответ может быть очевидным, но я никак не нагуглю
источник

∅ч

∅ ч in Rust — русскоговорящее сообществo
Hadji
Позволь мне воспользоваться этим порывом и поспрашивать про дизель пару вопросов, если не против) Я ознакомился с доками diesel и rocket и вот какой вопрос не могу решить.

В рокет для простоты предлагают записать вот это в Rocket.toml:
[global.databases]
sqlite_logs = { url = "/path/to/database.sqlite" }


А в доках к diesel предлагается сделать так:
echo DATABASE_URL=postgres://username:password@localhost/diesel_demo > .env


Мне лично интересен постгрес, а не sqlite. Не подскажешь, как мне:
1) обойтись без дублирования
2) хранить url в БД не в .toml файле, который коммитится в репу
.env и .toml это конфиги, ты можешь сам решить, откуда хочешь брать url.
.toml бы я наврятли скрывал, а вот прописать /.env в .gitignore в целом можно
источник

H

Hadji in Rust — русскоговорящее сообществo
∅ ч
.env и .toml это конфиги, ты можешь сам решить, откуда хочешь брать url.
.toml бы я наврятли скрывал, а вот прописать /.env в .gitignore в целом можно
Да, я о том же) Коряво сформулировал, видимо. Я б хотел это держать в .env, а не в toml
источник