< 返回版块

xxfye 发表于 2019-03-12 17:07

我有一个Row结构体如下,还有两个 str user_stremail_str 怎么将 user_str``email_str写入Row 的结构体中

#[repr(C)]
pub struct Row {
    id: i32,
    user: [char; 32],
    email: [char; 255],
}

评论区

写评论
sigoden 2019-03-19 19:23
#[repr(C)]
pub struct Row {
    id: i32,
    user: [char; 32],
    email: [char; 255],
}

impl Row {
    pub fn new(id: i32, user_str: &str, email_str: &str) -> Self {
        let mut user: [char; 32] = ['\0'; 32];
        let mut email: [char; 255] = ['\0'; 255];
        user.copy_from_slice(&user_str.chars().collect::<Box<[char]>>());
        email.copy_from_slice(&email_str.chars().collect::<Box<[char]>>());
        Row { id, user, email }
    }
}
gaxxx 2019-03-15 10:25

可以这样?

impl Row {
  fn fill<'a>(&mut self, s: &'a str) { 
    unsafe { 
        let src = s.chars().collect::<Vec<_>>(); 
        ptr::copy(src.as_ptr(), self.user.as_mut_ptr(), src.len());
    }
  }
}

比较坑的一点是, 如果不用s.chars()的话,直接copy会跪,为啥?

ptr::copy(s.as_ptr(), self.user.as_mut_ptr() as *mut u8, s.len());

Mike Tang 2019-03-14 11:27

把你代码贴出来瞧瞧

作者 xxfye 2019-03-13 21:25

还是没搞懂,最后手写一个函数做填充

Mike Tang 2019-03-12 23:03

数组你在 rust 中可理解成 slice。slice 相关有很多功能函数,你可以研究下。

对以下内容的回复:

目前我找到可能的方法是这样,不知道行不行

```
Row {
    id: id,
    user: unsafe { mem::transmute_copy(&user_str) },
    email: unsafe { mem::transmute_copy(&email_str) },
})
```

`Chars`不是字符数组啊

Rust貌似大力提倡Vec等数据结构,数组大部分可以生成其他东西,但String就转不过来
作者 xxfye 2019-03-12 22:16

目前我找到可能的方法是这样,不知道行不行

Row {
    id: id,
    user: unsafe { mem::transmute_copy(&user_str) },
    email: unsafe { mem::transmute_copy(&email_str) },
})

Chars不是字符数组啊

Rust貌似大力提倡Vec等数据结构,数组大部分可以生成其他东西,但String就转不过来

Mike Tang 2019-03-12 17:18

chars

或者

as_bytes

供你选择。

Mike Tang 2019-03-12 17:16

你可以用 markdown 语法把格式弄好一点。

1 共 8 条评论, 1 页