相关疑难解决方法(0)

什么使某事成为"特质对象"?

最近的Rust改变使得"特质对象"对我来说更加突出,但我只是模糊地掌握了什么让某些东西成为特质对象.特别是一个变化是允许特征对象将特征实现转发到内部类型的即将发生的变化.

鉴于一个特点Foo,我很确定这Box<Foo>是一个特质对象.是否&Foo也是一个特质对象?那么其他智能指针之类的东西Rc还是Arc?我怎样才能创建自己的类型作为特征对象呢?

引用只提到一次trait对象,但没有提到定义.

traits rust

38
推荐指数
3
解决办法
5858
查看次数

为什么特征中的泛型方法需要调整特征对象的大小?

我有这个代码(游乐场):

use std::sync::Arc;

pub trait Messenger : Sync + Send {
    fn send_embed<F: FnOnce(String) -> String>(&self, u64, &str, f: F)
        -> Option<u64> where Self: Sync + Send;
}

struct MyMessenger {
    prefix: String,
}
impl MyMessenger {
    fn new(s: &str) -> MyMessenger {
        MyMessenger { prefix: s.to_owned(), }
    }
}
impl Messenger for MyMessenger {
    fn send_embed<F: FnOnce(String) -> String>(&self, channel_id: u64, text: &str, f: F) -> Option<u64> {
        println!("Trying to send embed: chid={}, text=\"{}\"", channel_id, text);
        None …
Run Code Online (Sandbox Code Playgroud)

generics rust

9
推荐指数
3
解决办法
4527
查看次数

了解特征和对象安全

我正在努力解决对象安全的基础问题.如果我有这个代码

struct S {
    x: i32
}

trait Trait: Sized {
    fn f(&self) -> i32 where Self: Sized;
}

fn object_safety_dynamic(x: Trait) {}
Run Code Online (Sandbox Code Playgroud)

我收到

fn object_safety_dynamic(x: Trait) {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `traits::Trait` cannot be made into an object
= note: the trait cannot require that `Self : Sized`
Run Code Online (Sandbox Code Playgroud)

当添加/更改:Sized为特征的继承或f绑定时,我收到稍微不同的错误消息.

有人能解释一下:

  • 为什么这个特定的例子不起作用?Trait Objects一章说明"那么什么使方法对象安全?每种方法都必须要求Self: Sized".那不是满满的吗?

  • Trait: Sized和之间有什么区别where Self: Sized?(嗯,是的,一个继承了特性,另一个是参数绑定,但是从Rust的特质对象的角度来看?

  • 我必须做的首选改变是什么object_safety_dynamic

rustc 1.19.0-nightly (01951a61a 2017-05-20) …

traits rust trait-objects

3
推荐指数
2
解决办法
1279
查看次数

标签 统计

rust ×3

traits ×2

generics ×1

trait-objects ×1