Size: a a a

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

2020 December 06

YT

Yauheni Tsiarokhin in Rust — русскоговорящее сообществo
добрый день
подскажите плиз как такой паттерн подругому написать чтоб ворнинга не было

        let groups = ranks.into_iter().fold(HashMap::new(), |mut acc, x| {
           match acc.get(&x) {
               Some(n) => acc.insert(x, n + 1),
               None => acc.insert(x, 1)
           };

           acc
       });
источник

YT

Yauheni Tsiarokhin in Rust — русскоговорящее сообществo
а вот и ворнинг

warning: cannot borrow `acc` as mutable because it is also borrowed as immutable
  --> src/combination.rs:286:28
   |
285 |             match acc.get(&x) {
   |                   --- immutable borrow occurs here
286 |                 Some(n) => acc.insert(x, n + 1),
   |                            ^^^           - immutable borrow later used here
   |                            |
   |                            mutable borrow occurs here
   |
   = note: `#[warn(mutable_borrow_reservation_conflict)]` on by default
   = warning: this borrowing pattern was not meant to be accepted, and may become a hard error in the future
   = note: for more information, see issue #59159 <https://github.com/rust-lang/rust/issues/59159>
источник

YT

Yauheni Tsiarokhin in Rust — русскоговорящее сообществo
типа то я мапу и по мутабл референсу дергаю и по иммутабл
источник

YB

Yevhenii Babichenko in Rust — русскоговорящее сообществo
Yauheni Tsiarokhin
добрый день
подскажите плиз как такой паттерн подругому написать чтоб ворнинга не было

        let groups = ranks.into_iter().fold(HashMap::new(), |mut acc, x| {
           match acc.get(&x) {
               Some(n) => acc.insert(x, n + 1),
               None => acc.insert(x, 1)
           };

           acc
       });
Из матча вернуть значение, которое ты собрался вставлять, и уже после матча вызвать insert.
источник

YT

Yauheni Tsiarokhin in Rust — русскоговорящее сообществo
Yevhenii Babichenko
Из матча вернуть значение, которое ты собрался вставлять, и уже после матча вызвать insert.
то есть ему не нравится именно что это все в матче происходит?
источник

YT

Yauheni Tsiarokhin in Rust — русскоговорящее сообществo
заработало в самом деле
спасибо
источник

YB

Yevhenii Babichenko in Rust — русскоговорящее сообществo
Yauheni Tsiarokhin
то есть ему не нравится именно что это все в матче происходит?
Да, скорее всего, у тебя acc.get() возвращает не мутабельный референс на значение внутри acc, соответственно, ты не можешь вызвать метод, которому нужен мутабельный acc, пока есть этот референс.
источник

YT

Yauheni Tsiarokhin in Rust — русскоговорящее сообществo
Yevhenii Babichenko
Да, скорее всего, у тебя acc.get() возвращает не мутабельный референс на значение внутри acc, соответственно, ты не можешь вызвать метод, которому нужен мутабельный acc, пока есть этот референс.
понял благодарю а объяснение
источник

RP

Roman Proskuryakov in Rust — русскоговорящее сообществo
Yauheni Tsiarokhin
добрый день
подскажите плиз как такой паттерн подругому написать чтоб ворнинга не было

        let groups = ranks.into_iter().fold(HashMap::new(), |mut acc, x| {
           match acc.get(&x) {
               Some(n) => acc.insert(x, n + 1),
               None => acc.insert(x, 1)
           };

           acc
       });
еще можно попробовать

.filter_map( ... ).collect()
источник

RP

Roman Proskuryakov in Rust — русскоговорящее сообществo
а еще можно попробовать обычный for:

let mut letters = HashMap::new();

for ch in "a short treatise on fungi".chars() {
   let counter = letters.entry(ch).or_insert(0);
   *counter += 1;
}
источник

RP

Roman Proskuryakov in Rust — русскоговорящее сообществo
вообще будет читабельно и всем понятно.
источник

K

Kitsu in Rust — русскоговорящее сообществo
У structopt есть какая-нибудь штука для конфликтующих флагов? Видимо можно енам, но тогда нужно явно указывать субкоманду, как-то неоч
источник

YB

Yevhenii Babichenko in Rust — русскоговорящее сообществo
Kitsu
У structopt есть какая-нибудь штука для конфликтующих флагов? Видимо можно енам, но тогда нужно явно указывать субкоманду, как-то неоч
А можно пример того, как конфликтуют флаги? А то ничего не понятно.
источник

RP

Roman Proskuryakov in Rust — русскоговорящее сообществo
Kitsu
У structopt есть какая-нибудь штука для конфликтующих флагов? Видимо можно енам, но тогда нужно явно указывать субкоманду, как-то неоч
https://docs.rs/clap/2.33.3/clap/struct.Arg.html#method.conflicts_with

не структопт, но то, что нужно.
источник

K

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

K

Kitsu in Rust — русскоговорящее сообществo
Yevhenii Babichenko
А можно пример того, как конфликтуют флаги? А то ничего не понятно.
#[derive(StructOpt)]
struct Args {
 x: bool,
 y: bool
}

cargo r -- --x #<- ok
cargo r -- --y #<- ok
cargo r -- --x --y #<- ne ok
источник

s

suhr in Rust — русскоговорящее сообществo
Kitsu
У structopt есть какая-нибудь штука для конфликтующих флагов? Видимо можно енам, но тогда нужно явно указывать субкоманду, как-то неоч
У clap есть.
источник

YB

Yevhenii Babichenko in Rust — русскоговорящее сообществo
Kitsu
#[derive(StructOpt)]
struct Args {
 x: bool,
 y: bool
}

cargo r -- --x #<- ok
cargo r -- --y #<- ok
cargo r -- --x --y #<- ne ok
Что не ок? Твой пример (если сделать так, чтобы он компилировался) отлично работает.
источник

K

Kitsu in Rust — русскоговорящее сообществo
use structopt::clap::ArgGroup;
use structopt::StructOpt;

#[derive(Debug, StructOpt)]
#[structopt(
   group = ArgGroup::with_name("verbose"),
   group = ArgGroup::with_name("quiet").conflicts_with("verbose"),
)]
struct Opt {
   #[structopt(long, group = "verbose")]
   verbose: bool,
   #[structopt(long, group = "quiet")]
   quiet: bool,
}

fn main() {
   dbg!(Opt::from_args());
}


Остановился пока вот на таком, но оно падает со stack overflow -_-
источник

K

Kitsu in Rust — русскоговорящее сообществo
Yevhenii Babichenko
Что не ок? Твой пример (если сделать так, чтобы он компилировался) отлично работает.
последний кейс должен быть ошибочным
источник