traits 相关问题

在计算机编程中,特征是一组方法,用作“构建面向对象程序的简单概念模型”

暴露隐藏内部特征边界的函数和特征

目标 我试图提供一个通用函数,它将根据标准正态分布生成随机浮点数列表。特别是,我正在使用 rand 和 rand_distr 板条箱来执行...

回答 1 投票 0

为不同类型的参数实现 std::ops::Add

我想创建 std::ops::Add 的类型和实现,以便: 添加(位置,位移)->位置 添加(位移,位移)->位移 目的是胡说八道

回答 1 投票 0

为什么我们需要一个单独的 impl 来实现超级特征

阅读 Rust 书中的高级特性章节中有关超级特性的部分。尝试将其应用到一个超级简单的具体示例中,但有些东西我不明白。 当我定义一个 t...

回答 2 投票 0

Rust 中的通用特征参数

我有一个自定义智能指针,我正在尝试将其扩展到特征对象。本质上我想做的是: 使用 std::ptr::NonNull; 结构体 Ptr { 数据:NonN...

回答 1 投票 0

scala 编译器可以在 mixin 时强制实现抽象特征方法吗?

我有一个特点,具有抽象方法和具体实现的方法,所以像这样: 特征 MyTrait 扩展 BaseClass { def myAbstractMethod: MyReturnType def myConcreteMethod = { /*

回答 1 投票 0

有没有一种方法可以使用后缀表示法来调用 Rust 中的函数而不需要定义新的特征?

也许我的术语是错误的,但是有没有一种方法可以使用后缀表示法来调用 Rust 中的函数而不定义新的特征? 基本上,我有一个 &str 向量,我想转换...

回答 3 投票 0

为多个通用特征实现一个特征

我正在尝试实现显示和调试特征的特征,但 Rust 的响应是相互冲突的实现。 这是我的代码: pub 特征 AsString { fn as_string(self) -> 字符串; } 暗示&...

回答 1 投票 0

定义一个通用函数,它将接受对实现特定特征的任何可迭代事物的借用

我有一个特质和一个实现该特质的东西: 特征 HasPosition2D { fn x(&self) -> &i32; fn y(&self) -> &i32; fn x_mut(&mut self) -> &mut i32; ...

回答 1 投票 0

特征边界声明之间的差异

我正在为自己构建一个解析库,并且我发现了两种声明的特征边界类型之间的关键区别。 采取以下特征: pub 特征可解析:FromStr {} 随着...

回答 1 投票 0

我扩展了具有特征的类型,为什么我的 Vec<impl ThatTrait> 不接受实现该特征的类型?

我有一个特征输入,它向字符串和 u64 添加了 to_custom_bytes() 方法。 特征输入{ fn to_custom_bytes(&self) -> Vec; } impl 输入 u64 { fn to_custom_bytes(&

回答 1 投票 0

你能使用类型类来模拟 Rust 的 Fn 特性吗?

在 Rust 中,没有函数的类型,而是 Fn 特征,如下所示: 特征 Fn { fn 调用(self, args: A) -> R; } 那么函数的类型可以...

回答 1 投票 0

在 Rust 中实现通用的可增量特征

我试图了解如何在 Rust 中实现通用特征。 虽然我看过很多例子,但这些例子与特定用途(例如基因组突变子)太相关,我无法理解

回答 4 投票 0

为什么不能在 rust 中实现 impl Trait 类型

说我有以下特质: 特质 SayHello { fn say_hello(self) -> 字符串; } 为什么我可以这样做: fn say_hello_twice(this: impl SayHello) -> String { 让 said_hello = 这个。

回答 1 投票 0

如果不存在则采用默认值

具有如下特征 特质我的特质 { val国家:字符串, val状态:字符串, val commune:字符串=“无” } 现在实施 MyTrait 案例类 ImplementTrait( ...

回答 1 投票 0

如何在 Rust 中将特征向下转型为结构体

我定义了以下特征: 酒吧特质 TItem { // 一些函数 } 我有两个结构 TArray 和 TObject: 为 TArray 实现 TItem { // 一些函数 } 为 TObject 实现 TItem { // ...

回答 1 投票 0

如何从结构类型 T 转换为结构类型 U,这两者都实现了 Rust 中的特定特征

我定义了以下特征: 酒吧特质 TItem { // 一些函数 } 我有两个结构 TArray 和 TObject: 为 TArray 实现 TItem { // 一些函数 } 为 TObject 实现 TItem { // ...

回答 1 投票 0

为什么要通过 where 子句中的通用特征来约束单位类型(如 `where () : Trait<…>`)?

今天我在这里遇到了这种语法: https://github.com/binator/self/tree/80ba2ade?tab=readme-ov-file#example fn hex_primary(流:流)-> 已解析 今天我在这里遇到了这种语法: https://github.com/binator/self/tree/80ba2ade?tab=readme-ov-file#example fn hex_primary<Stream, Context>(stream: Stream) -> Parsed<u8, Stream, Context> where (): IntRadixParse<Stream, Context, u8>, { uint_radix(2, Radix::HEX).parse(stream) } 对我来说,它看起来像“绑定在单位类型(又名空元组)”,但我无法理解它。默认情况下,单一类型不会实现每个特征,不是吗?不幸的是,官方文档太模糊且不够完整(同时过于冗长),我找不到任何相关内容。 原始 RFC for where 子句也提到了这个语法,但没有正确的解释: https://rust-lang.github.io/rfcs/0135-where.html#alternatives fn increment<T>(c: T) -> T where () : Add<int,T,T> { 1 + c } 但除此之外,我知道这样的界限不仅可以在特征泛型中指定。 那么它是什么,什么时候使用,为什么需要它,它解决哪些问题? 在代码片段中,where子句用于缩小通用约束范围。不是定义所有约束,而是使用 (): IntRadixParse<Stream, Context, u8>,这意味着无论 Stream 和 Context 具有什么类型,它们都必须遵循 IntRadixParse 的约束。 特质IntRadixParse是 pub trait IntRadixParse<Stream, Context, Token: 'static> = where Stream: Streaming, <Stream as Streaming>::Item: Into<u8>, Token: CheckedAdd + CheckedMul + CheckedSub + Zero + Copy + Debug, Context: Contexting<IntRadixAtom<Token>>, Context: Contexting<BaseAtom<u8>>, Context: Contexting<CoreAtom<Stream>>, Context: Contexting<UtilsAtom<Stream>>, u8: AsPrimitive<Token>; 注意:它使用 trait 别名不稳定功能 因此,要编写没有奇怪的单位约束语法的函数,它会是这样的 fn hex_primary<Stream, Context>(stream: Stream) -> Parsed<u8, Stream, Context> where Stream: Streaming, <Stream as Streaming>::Item: Into<u8>, Context: Contexting<IntRadixAtom<u8>>, Context: Contexting<BaseAtom<u8>>, Context: Contexting<CoreAtom<Stream>>, Context: Contexting<UtilsAtom<Stream>>, { uint_radix(2, Radix::HEX).parse(stream) } 注意:函数中Token替换为u8 另一个示例: #![feature(trait_alias)] trait A<T> = where T: B; // Similar to `IntRadixParse` which // shows that T should implement B /// trait B with a method a trait B { fn a(self); } /// implemented for unit impl B for () { fn a(self) {} } fn a<T>(a: T) where (): A<T> { a.a() // T gets inferred to have implemented B and `a()` can be called } fn main() {} (): IntRadixParse<Stream, Context, u8>确实是单位类型的界限。它之所以有效,是因为特征别名1的定义如下: pub trait IntRadixParse<Stream, Context, Token: 'static> = where …; // where bounds omitted for brevity 特别注意where之前缺失的特征,没有特征,所以在条件成立的情况下,这个别名是没有任何特征的别名。 每种类型都满足“实现一组空的特征”,因此编译器唯一需要证明的就是边界。简而言之,因为 Self 没有被引用,并且没有任何特征可以满足,所以您可以在那里编写任何类型,而不是单位 () 。当类型不重要时,Rust 程序员经常使用单位。 这使得特征别名对于缩写一堆边界非常有用,就像 Timsib Adnap 的答案中所解释的那样 特质别名不稳定

回答 2 投票 0

Rust 中的 `where () : Trait<…>` 是什么?

今天我在这里遇到了这种语法: https://github.com/binator/self/tree/80ba2ade?tab=readme-ov-file#example fn hex_primary(流:流)-> 已解析 今天我在这里遇到了这种语法: https://github.com/binator/self/tree/80ba2ade?tab=readme-ov-file#example fn hex_primary<Stream, Context>(stream: Stream) -> Parsed<u8, Stream, Context> where (): IntRadixParse<Stream, Context, u8>, { uint_radix(2, Radix::HEX).parse(stream) } 对我来说,它看起来像“绑定在单位类型(又名空元组)”,但我无法理解它。默认情况下,单一类型不会实现每个特征,不是吗?不幸的是,官方文档太模糊且不够完整(同时过于冗长),我找不到任何相关内容。 原始 RFC for where 子句也提到了这个语法,但没有正确的解释: https://rust-lang.github.io/rfcs/0135-where.html#alternatives fn increment<T>(c: T) -> T where () : Add<int,T,T> { 1 + c } 但除此之外,我知道这样的界限不仅可以在特征泛型中指定。 那么它是什么,什么时候使用,为什么需要它,它解决哪些问题? 在代码片段中,where子句用于缩小通用约束范围。不是定义所有约束,而是使用 (): IntRadixParse<Stream, Context, u8>,这意味着无论 Stream 和 Context 具有什么类型,它们都必须遵循 IntRadixParse 的约束。 特质IntRadixParse是 pub trait IntRadixParse<Stream, Context, Token: 'static> = where Stream: Streaming, <Stream as Streaming>::Item: Into<u8>, Token: CheckedAdd + CheckedMul + CheckedSub + Zero + Copy + Debug, Context: Contexting<IntRadixAtom<Token>>, Context: Contexting<BaseAtom<u8>>, Context: Contexting<CoreAtom<Stream>>, Context: Contexting<UtilsAtom<Stream>>, u8: AsPrimitive<Token>; 注意:它使用 trait 别名不稳定功能 因此,要编写没有奇怪的单位约束语法的函数,它会是这样的 fn hex_primary<Stream, Context>(stream: Stream) -> Parsed<u8, Stream, Context> where Stream: Streaming, <Stream as Streaming>::Item: Into<u8>, Context: Contexting<IntRadixAtom<u8>>, Context: Contexting<BaseAtom<u8>>, Context: Contexting<CoreAtom<Stream>>, Context: Contexting<UtilsAtom<Stream>>, { uint_radix(2, Radix::HEX).parse(stream) } 注意:函数中Token替换为u8 另一个示例: #![feature(trait_alias)] trait A<T> = where T: B; // Similar to `IntRadixParse` which // shows that T should implement B /// trait B with a method a trait B { fn a(self); } /// implemented for unit impl B for () { fn a(self) {} } fn a<T>(a: T) where (): A<T> { a.a() // T gets inferred to have implemented B and `a()` can be called } fn main() {} 语法(): IntRadixParse<Stream, Context, u8>之所以有效,是因为特征别名1的定义如下: pub trait IntRadixParse<Stream, Context, Token: 'static> = where …; // where bounds omitted for brevity 特别注意where之前缺失的特征,没有特征,所以在条件成立的情况下,这个别名是没有任何特征的别名。 每种类型都满足“实现一组空的特征”,因此唯一剩下的就是边界。简而言之,您可以在那里编写任何类型,而不是单位(),当类型不重要时,Rust 程序员经常使用单位。 这使得特征别名对于缩写一堆边界非常有用,如 Timsib Adnap 所演示的 特质别名不稳定

回答 2 投票 0

Rust 中的 `where ()` 是什么?

今天我在这里遇到了这种语法: https://github.com/binator/self/tree/80ba2ade?tab=readme-ov-file#example fn hex_primary(流:流)-> 已解析 今天我在这里遇到了这种语法: https://github.com/binator/self/tree/80ba2ade?tab=readme-ov-file#example fn hex_primary<Stream, Context>(stream: Stream) -> Parsed<u8, Stream, Context> where (): IntRadixParse<Stream, Context, u8>, { uint_radix(2, Radix::HEX).parse(stream) } 对我来说,它看起来像“绑定在单位类型(又名空元组)”,但我无法理解它。默认情况下,单一类型不会实现每个特征,不是吗?不幸的是,官方文档太模糊且不够完整,我找不到任何相关内容。 原始 RFC for where 子句也提到了这个语法,但没有正确的解释: https://rust-lang.github.io/rfcs/0135-where.html#alternatives fn increment<T>(c: T) -> T where () : Add<int,T,T> { 1 + c } 但除此之外,我知道这样的界限不仅可以在特征泛型中指定。 那么它是什么,什么时候使用,为什么需要它,它解决哪些问题? 是的,这是单位类型的限制。 单位类型并没有实现许多有用的特征(尽管它确实实现了一些,例如Debug),但是在 Rust 中,你可以实现外来类型的特征,只要该特征是你自己的,或者在有限的情况下,即使该特征不是你的,但它的一些通用参数是。所以这个库可能定义了 IntRadixParse 类型,并为单位类型实现它。

回答 1 投票 0

如何在 Rust 中编写具有多个实现的抽象

在我的应用程序中,我希望有一个 EventPersister 特征,它定义持久事件的抽象,然后有各种实现,例如,将事件持久保存在内存中、文件中

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.