问题标签 [trait-objects]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
232 浏览

rust - 共享弱特征对象引用

我试图提供非拥有结构的“视图”来分离系统的组件。

假设一组具有不同方法的特征:DrawableModifiable以及许多实现至少一个特征的结构 - SimpleBoxPanelExpression

系统的不同组件将需要使用特定特征的方法频繁访问这些对象的序列;考虑 aDrawingManager或 a ModifyManager

虽然可以在两个管理器中引用单个对象,但假设所有结构都有一个单独的所有者:

理想情况下,能够管理从一个位置删除结构将是有用的——即只需将其从ObjectManager足以使所有其他组件中的引用无效的情况中删除(因此使用Weak)。

  • 有没有办法做到这一点?
  • 这是实现这一目标的正确方法吗?
  • 有没有更惯用的方式来实现这个功能?

该系统包含多个特征,因此使用所有其他特征的方法制作单个特征似乎是个坏主意。几个特征有不止一种方法,所以用闭包替换它们是不可能的。

我试过的

由于一个对象可能产生一个或多个Rc<Trait>,我们可以设想通过HashMap<ID, Vec<Rc<Any>>>使每个结构都有一个唯一的 来实现这一点ID,它映射到Rc为它制作的所有内容的列表。

当我们想要删除一个对象时,我们将它从相应的列表中删除,并删除 hashmap 中的条目,使所有Weak引用无效。

但是,实现这一点失败了,因为要插入HashMap,必须向上转换Rc<Trait>-> Rc<Any>,然后才能向下转换它。

0 投票
2 回答
2755 浏览

rust - 为什么不能调用 trait 对象上的函数时与 `Self: Sized` 绑定?

我有以下代码:

操场

导致此错误:

为什么这是不可能的?当我删除Self: Sized绑定时它可以工作,但是我不能使用泛型来使调用者更舒适。

这不是为什么 trait 中的泛型方法需要调整 trait 对象的大小?它问为什么你不能baz从特征对象调用。我不是在问为什么需要绑定;这已经讨论过了

0 投票
2 回答
785 浏览

rust - 尝试装箱特征对象时出现“预期的特征 A,找到 &A”

我正在尝试创建一个特征,它可以检索(并返回对)另一个特征的特征对象的引用,或者创建一个(并返回它的盒装版本),将选择权留给实现者(这意味着我需要将返回对象的生命周期限制为生产者的生命周期)。但是,我遇到了错误:

错误是:

这让我感到困惑,因为我希望 a&A也是A。我试过了impl<'a> A for &'a A,但这也无济于事。有没有什么办法解决这一问题?

0 投票
2 回答
267 浏览

rust - 泛型加动态调度

考虑一下我有一个make_numbers应该创建一串随机数的函数,但是我想在运行时(用户输入)决定应该使用哪种随机数生成器的情况。为了使它更加困难,让我们假设该make_numbers函数对要生成的数字类型是通用的。

我用伪代码写了我想要实现的东西,我明白为什么这不起作用。但是,我不知道 Rust 中的惯用方式会是什么样子来实现这一点?

我天真的想法是:

  1. 使用Box<Rng>,但这不起作用,因为Rng它具有通用功能。
  2. StdRng在and上使用枚举XorShiftRng,但我真的想不出一个好的方法来写这个。

你能给我一些关于这个特定问题的好的解决方案的提示吗?

注意:这个问题不是关于具有不同类型的不同匹配臂(解决方案可以是Box或枚举,如上所述) - 而是如何在这种情况下应用这些解决方案。

0 投票
2 回答
2842 浏览

rust - 不同具体类型的泛型 Vec

我有一个特质 Foo,具体类型 A 和 B 都受特质 Foo 的约束。我想返回 a Vec<Foo>,其中 Foo 可以是具体类型 A 或 B,如下所示:

此刻的编译器正在抛出未为 Foo 实现大小特征的错误。我可以将 Foo 包装在一个 Box 中,但我不想返回一个 Vec 特征对象,因为它们会带来运行时开销。

我想知道是否有一些 Rust 泛型功能可以让我返回泛型类型的 Vec 而不必使用 trait 对象。

0 投票
0 回答
65 浏览

rust - 对 Box 的使用寿命感到困惑指导

我无法证明为什么只有注释行无法编译并且认为x1' 的生命周期不够长。它似乎c2等同于它,除了直接Box用于Wrap结构。bt只是删除了一层结构。我无法弄清楚是什么让ContTrait行为如此不同。

这是取消注释该ContTrait行时的错误消息:

操场

0 投票
1 回答
897 浏览

rust - Rust:向量中结构的多态调用

我是 Rust 的新手,我正在尝试了解该语言的基础知识。

考虑以下特征

和两个实现它的结构:

在我的main()函数中,我想将Add 和的两个实例分组Multiply到一个向量中,然后调用该value方法。以下作品:

也是如此:

有没有更好/不那么冗长的方法?我可以解决将实例包装在 a 中的问题Box吗?在这种情况下,特征对象的要点是什么?

0 投票
2 回答
3293 浏览

function - 函数指针与 Fn 特征对象

这个函数接受闭包和函数指针。它采用函数指针作为参数类型。

什么时候我应该更喜欢这个而不是使用 trait 对象,比如&dyn Fn(i32) -> i32Box<dyn Fn(i32)-> i32>代替fn

或者

0 投票
1 回答
148 浏览

rust - 采用 &Box 的因式分解方法和 &T 作为参数

我有一个需要使用特征参数调用的方法(我们称之为Listener)。原因是有时我之前已将此特征参数存储到父结构中,因此它位于 a 内Box,有时则不在。

所以我有两种方法:

  • fref<T>(t: &T) where T: Listener
  • fbox(t: &Box<dyn Listener>)

我希望他们俩都打电话f(t: ??)。现在我复制了代码,freffbox可以工作但不好。所以我正在寻找一个签名,f它可以使它可以从我的代码中调用freffbox分解我的代码。我希望由实现的特征之一Box等同于&(或至少在某处找到共同点)。

我尝试了以下方法:

  • 写作f<T>(t: &T) where T: Listener但后来我不能从 fboxListener不是由Box<dyn Listener>)调用。
  • 然后将呼叫从内部fbox更改f(&*t)为取消装箱我的Box<Listener>但因为t不是Size我不能。

  • 写作f<T>(t: &T) where T: std::borrow::Borrow<Listener>,但后来我不能从frefBorrow不是由实现Listener)调用

  • AsRef<Listener>
  • Deref 游乐场的最后一次尝试:
0 投票
1 回答
76 浏览

rust - 为什么构建器函数需要大小特征来生成 Rc?

此代码工作正常(操场):

但是如果我制作一个包装器来生成如下所示的 Rc,编译器会抱怨缺少大小特征(playground

在这两种情况下,Bar::new 接收到具有相同类型 Rc 的参数,为什么 rust 编译器的反应不同?