Size: a a a

2020 October 28

V

Vladyslav Batyrenko in Rust Beginners
я, наверное, упускаю какую-то еще деталь, но не понимаю, как тут не получаются конфликтующие имплементации
источник

EG

Emmanuel Goldstein in Rust Beginners
Алексей Герасимов
<var> это Option? тогда да, можно конечно и на if let переписать
let is_helper = if let Some(m) = <var> { m.roles.contains(x) } else { false };
Моя версия короче
источник

EG

Emmanuel Goldstein in Rust Beginners
Vladyslav Batyrenko
Мне его сложновато прочитать, но такое впечатление, что такой его вызов forward_ref_unop! { impl Not, not for $t }

генерирует ровно такой же код:
        #[stable(feature = "rust1", since = "1.0.0")]
       impl Not for $t {
           type Output = $t;

           #[inline]
           fn not(self) -> $t { !self }
       }


https://doc.rust-lang.org/src/core/ops/bit.rs.html#44
forward_ref_unop имплементирует трейт для &T через трейт для T
источник

V

Vladyslav Batyrenko in Rust Beginners
ох, амперсанд...
источник

EG

Emmanuel Goldstein in Rust Beginners
Vladyslav Batyrenko
https://doc.rust-lang.org/src/core/ops/bit.rs.html#47-52

Эмм, я почему-то думал, что поведение ! оператора определяется имплементацией трейта Not. А тут в имплементации используется !self. Это как? :)
Операторы на примитивных типах никогда не вызывают трейты.
Даже если мы вручную эти трейты напишем.
https://gist.github.com/GoldsteinE/a516d41f13622837700c8d47d24659b0
(компилировать через rustc +nightly -Z force-overflow-checks=no demo.rs)
источник

AM

Anton Motin in Rust Beginners
Здравствуйте!
Я новичок.
Объясните пожалуйста, почему в данном примере из-за изменяемой ссылки не просто предупреждение, а вообще ошибка? Не могу понять из текста ошибки...

fn main() {
   let mut s = String::from("hello");
   let r = &mut s;
   println!("{}, {}", r, s);
}
источник

V

Vladyslav Batyrenko in Rust Beginners
Emmanuel Goldstein
Операторы на примитивных типах никогда не вызывают трейты.
Даже если мы вручную эти трейты напишем.
https://gist.github.com/GoldsteinE/a516d41f13622837700c8d47d24659b0
(компилировать через rustc +nightly -Z force-overflow-checks=no demo.rs)
Крутой пример, спасибо
источник

АГ

Алексей Герасимов... in Rust Beginners
Anton Motin
Здравствуйте!
Я новичок.
Объясните пожалуйста, почему в данном примере из-за изменяемой ссылки не просто предупреждение, а вообще ошибка? Не могу понять из текста ошибки...

fn main() {
   let mut s = String::from("hello");
   let r = &mut s;
   println!("{}, {}", r, s);
}
потому что нельзя ОДНОВРЕМЕННО ползоваться mut и не mut ссылками. Мутабельная ссылка уникальна, она не позволяет создавать никаких других ссылок, ну и любая ссылка не позволяет move’ать значение
источник

АГ

Алексей Герасимов... in Rust Beginners
то есть когда ты создаешь mut ссылку, ты замораживаешь значение
источник

EG

Emmanuel Goldstein in Rust Beginners
Anton Motin
Здравствуйте!
Я новичок.
Объясните пожалуйста, почему в данном примере из-за изменяемой ссылки не просто предупреждение, а вообще ошибка? Не могу понять из текста ошибки...

fn main() {
   let mut s = String::from("hello");
   let r = &mut s;
   println!("{}, {}", r, s);
}
Ты одновременно передаёшь в println!() мутабельную ссылку на s и сам s.
Rust автоматически берёт ссылку на аргументы println!(). Соответственно, у тебя одновременно существует &&mut s и &s, что противоречит правилам алиасинга: мутабельная ссылка не может сосуществовать с другой ссылкой.
источник

АГ

Алексей Герасимов... in Rust Beginners
на самом деле это все подробно в растбуке описано
источник

AM

Anton Motin in Rust Beginners
Emmanuel Goldstein
Ты одновременно передаёшь в println!() мутабельную ссылку на s и сам s.
Rust автоматически берёт ссылку на аргументы println!(). Соответственно, у тебя одновременно существует &&mut s и &s, что противоречит правилам алиасинга: мутабельная ссылка не может сосуществовать с другой ссылкой.
Спасибо!
Теперь понятно)

А то не мог понять: вроде всего одна ссылка и в чём запара.

Такой пример возник как раз при игре с примером из растбука😌
источник

AM

Anton Motin in Rust Beginners
Всем спасибо, кто ответил и подсказал)
источник

A

Adatan in Rust Beginners
объясните пожалуйста, почему так нужно?
источник

A

Adatan in Rust Beginners
источник

A

Adatan in Rust Beginners
вот так не работает, но если сделать &*name, то все норм
источник

EG

Emmanuel Goldstein in Rust Beginners
Anton Motin
Спасибо!
Теперь понятно)

А то не мог понять: вроде всего одна ссылка и в чём запара.

Такой пример возник как раз при игре с примером из растбука😌
Можно посмотреть на это с такой стороны: чтобы отобразить аргумент, на него в любом случае придётся взять иммутабельную ссылку, потому что Display::fmt() принимает &self
источник

EG

Emmanuel Goldstein in Rust Beginners
Autoderef.
&* может под капотом вызывать Deref::deref
источник

A

Adatan in Rust Beginners
почему *может* и зачем тут дереф?
источник

EG

Emmanuel Goldstein in Rust Beginners
Adatan
почему *может* и зачем тут дереф?
Дереф тут преобразовывает &String в &str
источник