2017-08-02 4 views
1

C++/Swift /その他の言語でベクトルのサイズを変更したい場合は、通常my_vec.resize(my_vec.size(), 0x00);のように記述しますが、これをRustで試してみるとimmutable borrow occurs hereというエラーが出ます。あなたは現在1に行の2を置くことができないRustの相対ベクトルリサイズのためのOne-Liner

+0

非常によく似た質問:https://stackoverflow.com/questions/41352710/nested-method-calls-with-mut-receivers-result-in-borrow-checker-errors – fghj

+1

https:///github.com/rust-lang/rfcs/issues/811これについての進歩を知ることは面白いでしょう。 – fghj

+0

これはベクトルを切り捨てるだけですか、それとも成長させることができるソリューションを探していますか? – 8bittree

答えて

3

let old_size = my_vec.len(); 
my_vec.resize(old_size - 2, 0x00); 

が、私はワンライナーがあることをかなり確信して...:もちろん

私はこのような何かを書くことができますCannot borrow as immutable because it is also borrowed as mutable in function argumentsに記載されている。

が、私はワンライナーがあることを確信している...もちろん

:あまり生意気

{ let old_size = my_vec.len(); my_vec.resize(old_size - 2, 0x00); } 

、あなたは形質メソッドを追加することができます。

trait ResizeRelative<T> { 
    fn resize_relative(&mut self, delta: isize, default: T); 
} 

impl<T: Clone> ResizeRelative<T> for Vec<T> { 
    fn resize_relative(&mut self, delta: isize, default: T) { 
     let len = if delta < 0 { 
      self.len() - ((-delta) as usize) 
     } else { 
      self.len() + delta as usize 
     }; 

     self.resize(len, default); 
    } 
} 

fn main() { 
    let mut v = Vec::new(); 
    v.resize_relative(3, 42); 
    v.resize_relative(-1, 2); 
    println!("{:?}", v); 
} 

両方向でサイズを変更できるようにするために必要な回転に注意してください。それでも、ゼロ以下にサイズを変更すると、パニックに陥る可能性があります。

+1

ああ、今問題を理解しています...私は関数が関数パラメータの後に評価されたと考えました。私は関数が実際に 'Vec :: resize(&mut my_vec、...)'に拡張されたことに気付かなかった –

関連する問題