Size: a a a

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

2020 September 30

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
wrapping же крутится, с чего-бы младшим битам нулями становится?

Но ещё раз: там умножение на 0
источник

Э

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

Э

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

A

Aragaer in Rust — русскоговорящее сообществo
isize::MAX >> 3 умножить на например 6 или 10. Младший бит будет нулевым. Если это число умножить еще раз на 6, то еще один младший бит станет нулевым.
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
А это нормально что for _ in 0u8.. {} паникует?

thread 'main' panicked at 'attempt to add with overflow', /rustc/04488afe34512aa4c33566eb16d8c912a3ae04f9/src/libcore/ops/arith.rs:94:45
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
источник

A

Aragaer in Rust — русскоговорящее сообществo
каждый множитель увеличивает количество "нулевых младших битов" на столько, какая в нем степень двойки.
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
А это нормально что for _ in 0u8.. {} паникует?

thread 'main' panicked at 'attempt to add with overflow', /rustc/04488afe34512aa4c33566eb16d8c912a3ae04f9/src/libcore/ops/arith.rs:94:45
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Рейнджа без верхнего лимита бесконечно крутится. Не знал?
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
Рейнджа без верхнего лимита бесконечно крутится. Не знал?
Нет
источник

Э

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

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
понятно
источник

c⁣

createStore<🦉>... in Rust — русскоговорящее сообществo
У меня actix-web и я отделяю бизнес-логику в отдельный крейт.

У меня есть трейт репо:
#[async_trait]
pub trait UserRepo {
   async fn save(&mut self, user: models::User) -> RepoResult<models::User>;
}


async_trait хочет , чтобы имплементор был Sync + Send

Я реализую трейт на структуре базы:

type Connection = r2d2::PooledConnection<ConnectionManager<PgConnection>>;
type DbPool = r2d2::Pool<ConnectionManager<PgConnection>>;

#[derive(Clone)]
pub struct Database(DbPool);


Базу я кладу в App
#[derive(Clone)]
pub struct App<Database = ()> {
   pub db: Database,
}

И уже для App реализую методы в стиле:
#[async_trait]
impl<Database> Authorize for App<Database>
where
   Database: repo::UserRepo + Send + Sync,
{
   async fn authorize(&mut self, info: UserInfo) -> Result<models::User, UpdateUserFailure> {


В HttpServer и actix_web::App укладываю так:

   let app = app_core::App {
       db: Database::new(database_url).expect("Failed to create database"),
   };

   let app_lock = std::sync::Arc::new(app);
   let app_data = web::Data::new(app_lock);


и в роуте вытаскиваю так:
pub async fn route(
   body: Json<Body>,
   app: Data<crate::App>,
)


use app_core::app::AccessoAuthorize;
app.authorize(cardbox_core::app::UserInfo {
   accesso_id: id,
   first_name,
   last_name,
})
.await;


Так, вот, на меня орут:
cannot borrow data in an Arc as mutable
trait DerefMut is required to modify through a dereference, but it is not implemented for std::sync::Arc<app_core::App<services::database::Database>>

Я
пытаюсь понять в какой контейнер мне положить App, чтобы он Send + Sync и дереференсился для вызова на нем мутабельных методов

Для удобства я положил всё в gist с подсветкой синтаксиса и тем же текстом

Подскажите плиз, я чет не могу понять что и как тут
источник

Э

Эрик in Rust — русскоговорящее сообществo
createStore<🦉> ⁣
У меня actix-web и я отделяю бизнес-логику в отдельный крейт.

У меня есть трейт репо:
#[async_trait]
pub trait UserRepo {
   async fn save(&mut self, user: models::User) -> RepoResult<models::User>;
}


async_trait хочет , чтобы имплементор был Sync + Send

Я реализую трейт на структуре базы:

type Connection = r2d2::PooledConnection<ConnectionManager<PgConnection>>;
type DbPool = r2d2::Pool<ConnectionManager<PgConnection>>;

#[derive(Clone)]
pub struct Database(DbPool);


Базу я кладу в App
#[derive(Clone)]
pub struct App<Database = ()> {
   pub db: Database,
}

И уже для App реализую методы в стиле:
#[async_trait]
impl<Database> Authorize for App<Database>
where
   Database: repo::UserRepo + Send + Sync,
{
   async fn authorize(&mut self, info: UserInfo) -> Result<models::User, UpdateUserFailure> {


В HttpServer и actix_web::App укладываю так:

   let app = app_core::App {
       db: Database::new(database_url).expect("Failed to create database"),
   };

   let app_lock = std::sync::Arc::new(app);
   let app_data = web::Data::new(app_lock);


и в роуте вытаскиваю так:
pub async fn route(
   body: Json<Body>,
   app: Data<crate::App>,
)


use app_core::app::AccessoAuthorize;
app.authorize(cardbox_core::app::UserInfo {
   accesso_id: id,
   first_name,
   last_name,
})
.await;


Так, вот, на меня орут:
cannot borrow data in an Arc as mutable
trait DerefMut is required to modify through a dereference, but it is not implemented for std::sync::Arc<app_core::App<services::database::Database>>

Я
пытаюсь понять в какой контейнер мне положить App, чтобы он Send + Sync и дереференсился для вызова на нем мутабельных методов

Для удобства я положил всё в gist с подсветкой синтаксиса и тем же текстом

Подскажите плиз, я чет не могу понять что и как тут
Arc<Mutex<T>>
источник

Э

Эрик in Rust — русскоговорящее сообществo
Собственно, когда до ошибки дочитал, сразу стало понятно.
источник

АГ

Алексей Герасимов... in Rust — русскоговорящее сообществo
createStore<🦉> ⁣
У меня actix-web и я отделяю бизнес-логику в отдельный крейт.

У меня есть трейт репо:
#[async_trait]
pub trait UserRepo {
   async fn save(&mut self, user: models::User) -> RepoResult<models::User>;
}


async_trait хочет , чтобы имплементор был Sync + Send

Я реализую трейт на структуре базы:

type Connection = r2d2::PooledConnection<ConnectionManager<PgConnection>>;
type DbPool = r2d2::Pool<ConnectionManager<PgConnection>>;

#[derive(Clone)]
pub struct Database(DbPool);


Базу я кладу в App
#[derive(Clone)]
pub struct App<Database = ()> {
   pub db: Database,
}

И уже для App реализую методы в стиле:
#[async_trait]
impl<Database> Authorize for App<Database>
where
   Database: repo::UserRepo + Send + Sync,
{
   async fn authorize(&mut self, info: UserInfo) -> Result<models::User, UpdateUserFailure> {


В HttpServer и actix_web::App укладываю так:

   let app = app_core::App {
       db: Database::new(database_url).expect("Failed to create database"),
   };

   let app_lock = std::sync::Arc::new(app);
   let app_data = web::Data::new(app_lock);


и в роуте вытаскиваю так:
pub async fn route(
   body: Json<Body>,
   app: Data<crate::App>,
)


use app_core::app::AccessoAuthorize;
app.authorize(cardbox_core::app::UserInfo {
   accesso_id: id,
   first_name,
   last_name,
})
.await;


Так, вот, на меня орут:
cannot borrow data in an Arc as mutable
trait DerefMut is required to modify through a dereference, but it is not implemented for std::sync::Arc<app_core::App<services::database::Database>>

Я
пытаюсь понять в какой контейнер мне положить App, чтобы он Send + Sync и дереференсился для вызова на нем мутабельных методов

Для удобства я положил всё в gist с подсветкой синтаксиса и тем же текстом

Подскажите плиз, я чет не могу понять что и как тут
вы не можете вызывать mut методы T на Arc<T>, ибо не thread-safe
источник

c⁣

createStore<🦉>... in Rust — русскоговорящее сообществo
Алексей Герасимов
вы не можете вызывать mut методы T на Arc<T>, ибо не thread-safe
это мне сказал rustc
источник

Э

Эрик in Rust — русскоговорящее сообществo
createStore<🦉> ⁣
У меня actix-web и я отделяю бизнес-логику в отдельный крейт.

У меня есть трейт репо:
#[async_trait]
pub trait UserRepo {
   async fn save(&mut self, user: models::User) -> RepoResult<models::User>;
}


async_trait хочет , чтобы имплементор был Sync + Send

Я реализую трейт на структуре базы:

type Connection = r2d2::PooledConnection<ConnectionManager<PgConnection>>;
type DbPool = r2d2::Pool<ConnectionManager<PgConnection>>;

#[derive(Clone)]
pub struct Database(DbPool);


Базу я кладу в App
#[derive(Clone)]
pub struct App<Database = ()> {
   pub db: Database,
}

И уже для App реализую методы в стиле:
#[async_trait]
impl<Database> Authorize for App<Database>
where
   Database: repo::UserRepo + Send + Sync,
{
   async fn authorize(&mut self, info: UserInfo) -> Result<models::User, UpdateUserFailure> {


В HttpServer и actix_web::App укладываю так:

   let app = app_core::App {
       db: Database::new(database_url).expect("Failed to create database"),
   };

   let app_lock = std::sync::Arc::new(app);
   let app_data = web::Data::new(app_lock);


и в роуте вытаскиваю так:
pub async fn route(
   body: Json<Body>,
   app: Data<crate::App>,
)


use app_core::app::AccessoAuthorize;
app.authorize(cardbox_core::app::UserInfo {
   accesso_id: id,
   first_name,
   last_name,
})
.await;


Так, вот, на меня орут:
cannot borrow data in an Arc as mutable
trait DerefMut is required to modify through a dereference, but it is not implemented for std::sync::Arc<app_core::App<services::database::Database>>

Я
пытаюсь понять в какой контейнер мне положить App, чтобы он Send + Sync и дереференсился для вызова на нем мутабельных методов

Для удобства я положил всё в gist с подсветкой синтаксиса и тем же текстом

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

#[async_trait]
impl<Database> Authorize for &App<Database>
where
   Database: repo::UserRepo + Send + Sync,

И вызывать на &mut &App.
источник

c⁣

createStore<🦉>... in Rust — русскоговорящее сообществo
Эрик
Хотя вру. Если там в authorize не используется мутабельный доступ, то нужно сделать

#[async_trait]
impl<Database> Authorize for &App<Database>
where
   Database: repo::UserRepo + Send + Sync,

И вызывать на &mut &App.
там fn authorize(&mut self,
и методы которые хотят mut у db
источник

Э

Эрик in Rust — русскоговорящее сообществo
createStore<🦉> ⁣
там fn authorize(&mut self,
и методы которые хотят mut у db
Тогда только мутекс.
источник

c⁣

createStore<🦉>... in Rust — русскоговорящее сообществo
Эрик
Тогда только мутекс.
его lock() выкинет панику если не сможет заблокировать, или будет ждать?
источник

АГ

Алексей Герасимов... in Rust — русскоговорящее сообществo
ждать
источник