【发布时间】:2021-08-14 05:10:07
【问题描述】:
以下代码采用[[char; 10]; 3] 键盘布局并返回按键所需的手指和手指移动。
根据我对 Rust 中所有权和借用的初步理解,我认为开发人员只需要担心堆上分配的内存的所有权。另一方面,基元会在必要时复制自己。
impl KeyboardBuilder {
fn build(char_layout: [[char; 10]; 3]) -> HashMap<char, Key> {
char_layout
.iter()
.enumerate()
.map(|(y, row)| {
row.iter().enumerate().map(|(x, char)| {
(char, Key::new(
char,
KeyboardBuilder::get_finger(x as u8),
KeyboardBuilder::get_pos(x as u8, y as u8),
))
})
})
.flatten()
.collect()
}
}
要更正代码,我必须更改char 的所有权,并使用move 移动所有权。
char_layout
.iter()
.enumerate()
.map(|(y, row)| {
row.iter().enumerate().map(move |(x, char)| {
// ^^^^
(char.to_owned(), Key::new(
// ^^^^^^^^^
char.to_owned(),
// ^^^^^^^^^
KeyboardBuilder::get_finger(x as u8),
KeyboardBuilder::get_pos(x as u8, y as u8),
))
})
})
我有多个问题,
- 为什么我必须更改原语的所有权?为什么他们不创建从迭代器到迭代器的副本?
-
move和to_owned()的功能和区别是什么? - 我必须在
tupal和Key::new参数中都使用to_owned()。现在char的所有者是谁?
【问题讨论】:
标签: rust