我正在遵循本书中的链表实现。和List结构Node是这样的 -
type Link<T> = Option<Rc<RefCell<Node<T>>>>;
#[derive(Debug)]
pub struct List<T> {
head: Link<T>,
tail: Link<T>,
}
#[derive(Debug)]
struct Node<T> {
elem: T,
next: Link<T>,
prev: Link<T>,
}
Run Code Online (Sandbox Code Playgroud)
我有一个push_front像下面这样的方法 -
pub fn push_front(&mut self, elem: T) {
let new_node = Node::new(elem);
let new_node = Rc::new(RefCell::new(new_node));
let mut old_head = self.head.take();
old_head.as_mut().map(|node| {
node.borrow_mut().prev = Some(Rc::clone(&new_node));
});
new_node.borrow_mut().next = old_head.clone();
self.head = Some(new_node);
if self.tail.is_none() {
self.tail = self.head.clone();
}
}
Run Code Online (Sandbox Code Playgroud)
该代码编译良好。List但是每当我在测试中放入调试打印时,我都会收到测试失败并显示消息thread …
AsRef[i32]我编写了一个函数,它采用带有bound的通用参数T。现在我想使用方法在函数内部进一步对输入进行切片get。但 Rust 编译器不允许我使用1..范围来切片。我可以使用split_at方法来分割切片。那可行。但我的问题是为什么我不能array.as_ref().get([1..])在这种情况下使用?我是否需要向泛型类型添加任何其他特征边界才能使其工作?如果我使用这样get的一个索引array.as_ref().get(0)就可以了。
这是我的代码 -
fn find<T>(array: T, key: i32) -> Option<usize>
where
T: AsRef<[i32]>,
{
let arr = array.as_ref().get([1..]);
println!("slicing successful");
None
}
fn main() {
let arr = [1, 2, 3];
find(arr, 1);
}
Run Code Online (Sandbox Code Playgroud)
rust ×2