Каков наилучший способ решить проблему «изменчивое заимствование происходит здесь» в этой ситуации?

#apache-kafka #rust

Вопрос:

Я новичок в ржавчине.

Я знаю, что произошло, потратил целый день на попытки и, наконец, не смог найти никакого решения…

Нужна помощь от добрых людей T_T

 use kafka::client::{FetchOffset, GroupOffsetStorage, KafkaClient};

fn main() {
  let mut client = KafkaClient::new(vec!["localhost:9092".to_owned()]);
  client.load_metadata_all().unwrap();
  client.set_group_offset_storage(GroupOffsetStorage::Kafka);
  for topic in client.topics().names() {
    let topic_offsets = client.fetch_topic_offsets(topic, FetchOffset::Latest).unwrap();
    println!("{:?}", topic_offsets);

    let group_topic_offsets = client.fetch_group_topic_offsets("test", topic).unwrap();
    println!("{:?}", group_topic_offsets);
    for (partition_index, tp_offset) in topic_offsets.iter().enumerate() {
      println!("partition {}'s lag = {}", partition_index, tp_offset.offset - group_topic_offsets[partition_index].offset)
    }
  }
}
 
 error[E0502]: cannot borrow `client` as mutable because it is also borrowed as immutable
  --> src/main.rs:11:31
   |
7  |   for topic in amp;mut client.topics().names() {
   |                ----------------------------
   |                |    |
   |                |    immutable borrow occurs here
   |                immutable borrow later used here
...
11 |     let group_topic_offsets = client.fetch_group_topic_offsets("test", topic).unwrap();
   |                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here

error: aborting due to 2 previous errors
 

Комментарии:

1. Просто соберите названия тем в Vec<String> ? Кроме того, посмотрите, доступна ли информация, которую вы ищете, в самих темах, чтобы избежать повторного просмотра Клиента.

2. В случае, если не очевидно, что предложил Масклинн, вы можете перейти for topic in client.topics().names() { ... } на for topic in client.topics().names().collect::<Vec<_>>() { ... } . Таким образом, вы сначала соберете имена в a Vec и освободитесь client для других вещей.

3. Большое спасибо! Теперь это работает очень хорошо!