trait-objects相关内容
fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 { // definition f(arg) + f(arg) } do_twice(|x| x + 1, 5) // call 此函数同时接受、闭包和函数指针。它以函数指针作为参数类型。 什么时候我应该更喜欢使用特征对象,如&dyn Fn(i32) -> i32或Box
..
我正在努力学习对象安全的基础知识.如果我有这个代码 struct S {x: i32,}特质特质:大小{fn f(&self) ->i32在哪里自我:尺码;}fn object_safety_dynamic(x: Trait) {} 我收到 error[E0038]: trait `Trait` 不能变成一个对象-->src/lib.rs:11:29|5 |特质特质:大小{|----- --
..
我想在线程之间发送一个 trait 对象,但不知道是否可行.看起来可能不是,因为它们显然不满足 Send 特性. 以下代码演示了我正在尝试执行的操作: 使用 std::{同步::mpsc::{通道,接收器,发送器},线,};特质栏{fn bar(&self);}结构 Foo {富:i32,}为 Foo { impl Bar {fn bar(&self) {println!("foo: {}
..
最近的 Rust 更改使“特征对象"对我来说更加突出,但我对真正使某些东西成为特征对象的原因只有模糊的了解.一项特别的变化是 即将到来的变化,以允许 trait 对象将 trait 实现转发到内部类型. 给定一个特征 Foo,我很确定 Box/Box 是一个 trait 对象.&Foo/&dyn Foo 也是 trait 对象吗?其他诸如 Rc 或 Arc 之类的智能指针的东西呢?我怎样才能
..
在下面的代码中,不可能从对实现相同特征的动态大小类型的引用中获取对特征对象的引用.为什么会这样?&dyn Trait 和 &(?Sized + Trait) 如果我可以同时使用两者来调用 trait 方法,那么这两者究竟有什么区别? 实现 FooTraitContainerTrait 的类型可能例如have type Contained = dyn FooTrait 或 type Conta
..
我有以下代码: extern crate 期货;//0.1.24使用期货::未来;使用 std::io;结构上下文;酒吧特质 MyTrait {fn 接收(上下文:上下文)->Future;}酒吧结构我的结构{我的特质:我的特质,} 当我尝试编译它时,我收到错误消息: error[E0038]: trait `MyTrait` 不能变成一个对象-->src/lib.rs:13:5|13 |我
..
我正在编写一些代码,并且有一个特性,它带有一个按值获取 self 的方法.我想在 Box 的 trait 对象上调用这个方法(消耗 Box 及其值).这可能吗?如果是这样,如何? 在代码方面,一个最小的例子看起来像下面的(不完整的)代码: trait 消耗品 {fn 消耗(自我)->u64;}fn consumer_box(ptr: Box) ->u64 {//我可以在这里放什么?} 我
..
引用本书(强调我的), 当使用 trait 时,用具体类型参数填充的泛型类型参数也是如此:具体类型成为实现 trait 的类型的一部分.当通过使用 trait 对象忘记类型时,无法知道用什么类型填充泛型类型参数. 我无法理解其中的原理.对于一个具体的例子,请考虑以下 pub trait Echoer {fn echo (&self, v: T) ->;}酒吧结构 Foo { }
..
试图创建一个数据库结构,它是向量的 HashMap.每个Vec包含Box. 使用 std::collections::HashMap;特质模型{fn id(&self) ->i32;}结构用户;结构体消息;用户的 impl 模型 {fn id(&self) ->i32 { 4 }}消息的impl模型{fn id(&self) ->i32 { 3 }}结构数据库{用户:Vec,消息:Vec,表:H
..
trait FooTrait {}结构 FooStruct;为 FooStruct {} 实现 FooTraitfn 主(){让maybe_struct: Option= 无;//不编译letmaybe_trait: Option>=maybe_struct.map(Box::new);//编译正常letmaybe_trait: Option
..
这是我的代码: 使用 std::rc::{Rc, Weak};使用 std::cell::RefCell;特质特质{}fn push(e: E) {让 mut v:Vec>>= Vec::new();//让 x = Rc::new(RefCell::new(Box::new(e)));//v.push(x);//错误v.push(Rc::new(RefCell::new(Box::new(e))
..
我正在使用光线跟踪器,并且希望对所有可击中对象进行建模以提供一个公共界面. 我实现了一个名为Object的特征,所有可点击对象都实现了该特征.我创建了一个名为Intersection的结构,其中包含f32值和对实现对象特征的结构的引用. 代码: 使用std :: sync :: atomic :: {AtomicUsize,Ordering};使用super :: ray :: Ra
..
我有一个特征MyTrait,并且我希望所有特征对象&MyTrait彼此可比,并且别无其他.我现在基于如何测试特征对象之间的相等性?. 问题是我需要在所有地方都使用MyTraitComparable,而不是MyTrait.有办法解决这个问题吗? use std::any::Any; trait MyTrait {} trait MyTraitComparable: MyTrait {
..
use std::sync::Arc; trait Trait {} struct TraitImpl {} impl Trait for TraitImpl {} fn main() { let value = TraitImpl {}; let _: Arc = Arc::new(value); // compiles let _: Ar
..
我有以下代码: trait Bar { fn baz(&self, arg: impl AsRef) where Self: Sized; } struct Foo; impl Bar for Foo { fn baz(&self, arg: impl AsRef) {} } fn main() { let boxed
..
我有以下代码 extern crate rand; use rand::Rng; pub struct Randomizer { rand: Box, } impl Randomizer { fn new() -> Self { let mut r = Box::new(rand::thread_rng()); // works
..
这是来自“>不同的表情.当我们使用特征对象的引用时,那里提供的解决方案工作得很好,但是这次我尝试使用Rc指针做同样的事情.例如 我有一个名为TraitAB的超级特征和两个名为TraitA和TraitB 的特征 因此,当我第一次创建类型为TraitAB的特征对象而不是使用Box时,现在我使用的是Rc指针. 我需要类型为TraitA的变量作为ab 的引用 这里我举了一个非常小的例子:
..
我正在阅读一本Rust书,这个例子让我感到困惑: use std::fmt::Display; fn main() { test("hello"); test2("hello") } fn test(s: &dyn Display) { println!("{}", s); } fn test2(s: &str) { println!("{}", s);
..
编写具有特征的代码时,可以将特征置于特征绑定中: use std::fmt::Debug; fn myfunction1(v: Box) { println!("{:?}", v); } fn myfunction2(v: &T) { println!("{:?}", v); } fn main() { myfunc
..
我最初在此处提出了这个问题,但是标记为重复,尽管我认为它仅重复了一部分,所以我创建了一个更具体的副本: 考虑以下代码: use std::rc::Rc; trait MyTrait { fn trait_func(&self); } struct MyStruct1; impl MyStruct1 { fn my_fn(&self) { // do
..