私は一般的な構文と錆を学ぶためにいくつかの基本的なデータ構造を開発しています。ここで私は、スタックのために思い付いたものです:`fn pop(&mut self) - >結果<T, &str>`の呼び出しは、引き続き自分のデータ構造を借用していますか?
#[allow(dead_code)]
mod stack {
pub struct Stack<T> {
data: Vec<T>,
}
impl<T> Stack<T> {
pub fn new() -> Stack<T> {
return Stack { data: Vec::new() };
}
pub fn pop(&mut self) -> Result<T, &str> {
let len: usize = self.data.len();
if len > 0 {
let idx_to_rmv: usize = len - 1;
let last: T = self.data.remove(idx_to_rmv);
return Result::Ok(last);
} else {
return Result::Err("Empty stack");
}
}
pub fn push(&mut self, elem: T) {
self.data.push(elem);
}
pub fn is_empty(&self) -> bool {
return self.data.len() == 0;
}
}
}
mod stack_tests {
use super::stack::Stack;
#[test]
fn basics() {
let mut s: Stack<i16> = Stack::new();
s.push(16);
s.push(27);
let pop_result = s.pop().expect("");
assert_eq!(s.pop().expect("Empty stack"), 27);
assert_eq!(s.pop().expect("Empty stack"), 16);
let pop_empty_result = s.pop();
match pop_empty_result {
Ok(_) => panic!("Should have had no result"),
Err(_) => {
println!("Empty stack");
}
}
if s.is_empty() {
println!("O");
}
}
}
私はこの興味深いエラーが発生します。
error[E0502]: cannot borrow `s` as immutable because it is also borrowed as mutable
--> src/main.rs:58:12
|
49 | let pop_empty_result = s.pop();
| - mutable borrow occurs here
...
58 | if s.is_empty() {
| ^immutable borrow occurs here
...
61 | }
| - mutable borrow ends here
は、なぜ私はちょうど私の変更可能な構造体にpop
を呼び出すことはできませんか?
なぜpop
は値を借りますか?それの後に.expect()
を追加しても問題ありません。私はis_empty
が不変の参照を取ることを知っています。もし私がそれを変更可能なものに切り替えると、私はちょうど2番目の変更可能な借用を取得します。
@MatthieuM。良い点;私のところでは怠け者。私は更新しました。 – Shepmaster
返品の変更に何か変更がありますか?私は個人的な好みのためにそれを行うだけでなく、変数をタイプするので、私が戻り値の型を適切に理解すれば、今のところわかります。 –
@SamuelYvonいいえ、私の提案は何も変わりません。あなたは何でもしたいことができますが、**あなたがいる言語のコーディング規約に従うことを強くお勧めします**他の錆コード、JSコードのようなJSコード、他のGoコードのようなGoコード、他のRubyコードのようなRubyコードなど – Shepmaster