当前位置: 首页 > 知识库问答 >
问题:

新类型模式错误:无法移出

岳泉
2023-03-14

我想围绕现有类型/结构创建一个Wrapper。根据Newtype模式,根据Rust Book ch 19,“在Wrapper上实现Deref trait以返回内部类型将访问所有底层方法”:

https://doc.rust-lang.org/book/ch19-03-advanced-traits.html

这是我在字符串包装器上的实现。一个简化示例:

struct Wrapper(String);

impl Deref for Wrapper {
    type Target = String;

    fn deref(&self) -> &Self::Target {
        &self.0 //pointer to Inner value
    }
}

但是,调用消耗self的方法会引发错误:

fn main() {
    let d = "Dog".to_string();
    let w = Wrapper(d);
    w.into_bytes();
}

错误:无法从Wrapper的取消引用中移动,因为value的类型为std::string::String,它没有实现Copy特性

因此我有两个问题:

  1. 我的实现有什么问题,如何使它工作?
  2. 我想让它与自己正常工作,

共有1个答案

蒲昊苍
2023-03-14

我的实现出了什么问题,如何使其工作?

String::into_bytes移动字符串,在您的情况下,您只能访问它的引用

您可以使用字节,它将迭代器返回到字节,而不移动它:

fn main() {
    let d = "Dog".to_string();
    let w = Wrapper(d);
    let b = w.bytes();
    println!("{b:?}");
}

我想让它与self正常工作,

一般来说,您需要考虑签名:

    < li>Deref -

使用从/Into示例

struct Wrapper(String);

impl From<Wrapper> for String {
    fn from(w: Wrapper) -> String {
        w.0
    }
}

fn main() {
    let d = "Dog".to_string();
    let w = Wrapper(d);
    let s: String = w.into();
    let bytes = s.into_bytes();
    println!("{bytes:?}");
}

游戏场

您还可以考虑查看 std::borrow 模块,该模块具有允许您将类型用作其他类型的特征。

最后,您的方法可能有效,但如前所述,您不能从

use std::ops::Deref;

struct Wrapper(String);

impl Deref for Wrapper {
    type Target = String;

    fn deref(&self) -> &Self::Target {
        &self.0 //pointer to Inner value
    }
}

fn main() {
    let d = "Dog".to_string();
    let w = Wrapper(d);
    let b = w.deref().clone().into_bytes();
    println!("{b:?}");
}

游戏场

 类似资料:
  • 我有一个页面显示了单个测试用例的详细信息。出于某种原因,我无法跳过这个错误,甚至无法发送。这是我的控制器: 以下是错误: 在视野中。php第180行位于HandleExceptions-

  • 我试图设置一个项目与Karaf 4.0.4 HiberNate 4.3.6。最终,我使用MariaDB 10.0.23作为数据库。 我遵循并尝试了本教程,但: 而不是使用数据源blueprint.xml我想使用pax-jdbc-config来创建一个数据源(因为数据源蓝图不建议使用)。 而不是MySQL,我必须使用MariaDB。所以我假设我必须更改一些配置文件来使用MariaDB驱动程序 因此,

  • 问题内容: 对于Java的最终结业,我们在测试中包含“异常”部分,其中包括try,catch和finally调用。当我尝试将示例代码放入Eclipse时,遇到了错误并抛出了新的领域。所有错误都显示“无法解析键入”。 如何解决此问题,以便可以学习/查看代码应该执行的操作? Q4类 Q4Exception类 问题答案: 我认为值得一提的是,在Eclipse中,Ctrl + Shif + O可以为您解决

  • 我收到错误: 错误类型错误: 无法读取在评估 (webpack-internal:///./node_modules/@angular/common/esm5/http.js:163) 处未定义的属性 “长度”在 Array.forEach () 在 httpHeaders.lazyInit (webpack-internal:///./node_modules/@angular/common/e

  • 问题内容: 我有一个让我感到困惑的奇怪问题。我有一个模型: 变体条目如下所示: 我需要添加一个新字段-说“颜色”。所以我这样做是为了批量更新: 但是,“颜色”字段未设置-如果我再次浏览并注释掉该行,则它不会显示。我似乎无法弄清楚为什么要这样做。我有一个onSave事件,该事件已正确触发,因此可以保存。我也没有对版本结构进行任何检查- 即没有代码只允许代码和价格。我显然缺少了一些东西,但几个小时后我

  • 问题内容: 当我启动android studio时,出现以下错误: 我使用最新的Android Studio和Latest(1.6)Gradle。这是什么问题?我使用32位窗口8 问题答案: 重要提示:我是在新的Android Studio上完成的!如果您有插件,那么它可能不适合您! 我找到了适合我的解决方案: 去摇篮 下载最新版本 在Android Studio中打开Grandle的位置(在我的