traits 相关问题

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

如何向下转换为 MyStruct 并访问 Arc<Mutex<MyStruct>> 实现的方法?

我正在尝试对现有的实现进行一些测试,我无法出于测试目的对其进行更改。 为了使测试正常进行,我需要将一个 dyn Thing 转换为 RealThing。问题是...

回答 1 投票 0

“一揽子实现”在 Rust 中返回错误

我创造了一个特质: 酒吧特质 DimenBasics { // --剪断-- fn get_value(&self) -> f64; fn get_unit(&self) -> 字符串; fn verify_add(&self, other: &Self) -> 结果...

回答 1 投票 0

可选择取消引用对 Copy 对象的引用的特征?

我正在实现一个按值获取元素列表的函数,但我需要对列表执行两次传递。第一遍计算输入数据的一些值(不修改...

回答 1 投票 0

将值强制转换为特征对象的规则是什么?

考虑以下 Rust 代码: #[导出(调试、克隆、复制)] 结构体; 特质 特质 {} struct {} 的 impl Trait fn f() { // 为什么会强制转换为目标类型 (Result 考虑以下 Rust 代码: #[derive(Debug, Clone, Copy)] struct Struct; trait Trait {} impl Trait for Struct {} fn f() { // Why does this coerce to the target type (Result<Box<dyn Trait>, ()>) let rbdt: Result<Box<dyn Trait>, ()> = Ok(Box::new(Struct)); // And this coerces to the target type... let a = Box::new(Struct); let rbdt: Result<Box<dyn Trait>, ()> = Ok(a); // But this does not: let a = Ok(Box::new(Struct)); let rbdt: Result<Box<dyn Trait>, ()> = a; // Error: mismatched types } 为什么对 rbdt 的前两个赋值可以正确工作,将值强制转换为目标类型 (Result<Box<dyn Trait>, ()>),但第三个却不能?在我看来,在所有三种情况下,赋值的 RHS 类型都是 Result<Box<Struct>, ()>,因此令人困惑的是,某些形式可以工作,而其他形式会导致类型不匹配错误。 何时可以将包含特征对象的类型分配给哪些规则?这些记录在任何地方吗? 我认为这不是强制,而是推理。 在前两种情况下,可以立即推断出T中的Result<Box<T>>不是Struct,而在第三种情况下,Box<Struct>已经是一个具体类型,这与类型注释引入的T = dyn Trait要求相冲突在 rdbt。

回答 1 投票 0

防止特征函数被其他结构实现

我只是构建了一个具有 2 个函数的特征 Bar(带有实现的 alpha() 和仅带有接口的 beta()),并且我希望实现 Bar 的结构体仅实现 beta(),并且永远不要实现自己的

回答 1 投票 0

具有多个成员的 Rust 特征,默认实现,相互依赖

假设我想引入一个具有两种方法的特征,这两种方法在某种意义上是相互依赖的,其中一个可以默认使用另一个来实现。例如: 使用 std::io; 特质

回答 1 投票 0

选项字段中的向上转换特征

我刚刚学习 Rust,在选项内向上转换特征引用时遇到一些问题。我想将其作为参考传递以减少开销。 基本思路如下: 我有一些物体(孩子)

回答 1 投票 0

为什么Traits不能直接实例化?

在 PHP 中测试特征时,我有点困惑为什么要引入特征。我做了一些小实验。首先我直接在类中调用特征方法 在 PHP 中测试特征时,我有点困惑为什么要引入特征。我做了一些小实验。首先我直接在类中调用特征方法 <?php trait HelloWorld { public function sayHello() { echo 'Hello World!'; } } class TheWorldIsNotEnough { use HelloWorld; public function sayHellos() { $o = new HelloWorld(); $o->sayHello(); } } $o = new TheWorldIsNotEnough(); $o->sayHellos(); ?> 我收到一个错误 Fatal error: Cannot instantiate trait HelloWorld in C:\xampp\htdocs\test.php on line 35 但是当我这样做的时候 <?php trait HelloWorld { public function sayHello() { echo 'Hello World!'; } } class MyHelloWorld { use HelloWorld; } class TheWorldIsNotEnough { use HelloWorld; public function sayHellos() { $o = new MyHelloWorld(); $o->sayHello(); } } $o = new TheWorldIsNotEnough(); $o->sayHellos(); ?> 我能够调用特征方法,结果显示“Hello World!”。 那么使用 Traits 的优点是什么?它与抽象类有何不同?请帮助我理解用法。谢谢。 Traits 不应被实例化。它们只是代码部分,您可以通过 use 在类中重用它们。您可以想象,trait代码会扩展并成为您的类的一部分。甚至令人悲伤的是: 特征本质上是语言辅助的复制和粘贴。 所以你的例子应该像这样工作: <?php trait HelloWorld { public function sayHello() { echo 'Hello World!'; } } class TheWorldIsNotEnough { use HelloWorld; public function sayHellos() { // your trait defines this method, so now you can // think that this method is defined in your class directly $this->sayHello(); } } $o = new TheWorldIsNotEnough(); $o->sayHellos(); //or simply $o->sayHello(); ?> 感谢所有发布答案的人,但经过大量研究后得到了我真正寻找的答案。我的问题是是什么使 Traits 与抽象类、继承等现有方法不同。在类内部调用时实例化它是可以的,但最大的区别是我们可以通过这种方式在类中包含多个特征 use class1, class2; 如果两个类中存在相同的方法并且我们想使用 class2 中的方法时发生冲突,我们会这样做 use class1, class2 { class2::method1 insteadof class1; } 甚至特征也可以有多个这样定义的特征: trait Class1 { use trait1, trait2; } 与继承不同;如果特征具有静态属性,则使用该特征的每个类都具有这些属性的独立实例。 检查此链接http://php.net/manual/en/language.oop5.traits.php#107965 特征与继承的另一个区别是特征中定义的方法可以访问它们所使用的类的方法和属性,包括私有的。 http://php.net/manual/en/language.oop5.traits.php#109508. 与接口实现不同的是,所有特征方法都可以访问而无需再次定义。 好吧,这可能不是正确的方法,但我想出了一种如何使用 Traits 的方法,以及为什么它在某些情况下对我的项目更好。它们是类的一种扩展。如果您熟悉 CakePHP,这些 Traits 让我想起模型的行为或控制器的组件。只要查一下就可以了:-) 抽象类略有不同,因为您可以像这样使用它进行继承: abstract class HelloWorld { public function sayHello() { echo "Hello World!"; } abstract public function doFunnyStuff(); abstract public function doMoreFunnyStuff(); } class ConcreteHelloWorld extends HelloWorld { public function doFunnyStuff() { echo "Funny Hello!"; } public function doMoreFunnyStuff() { echo "More Funny Hello!"; } } $o = new ConcreteHelloWorld(); $o->sayHello(); // common property $o->doFunnyStuff(); // specialy implemented property $o->doMoreFunnyStuff(); // specialy impelemented property 特质更像是一个类的扩展。我正在 MVC 框架中使用 Traits 以这种方式扩展带有日志记录的类: trait Logger { public function saveLog($kindOf, $messasge, $serverity) { some_connect_to_DB_pseudo_code(); $sqlQuery = "INSERT INTO log (kindof, message, serverity) VALUES (".$kindof.", ".$message.", ".$serverity.")"; mysql_query($sqlQuery); // deprecated :-) } } class Controller extends AppController { use Logger; public function someAction($params) { $this->saveLog("CALL", __METHOD__." - started some Action with params: ".$params, 0); ... ... } } 它非常方便,因为我在每个类中都使用它,而且我不必在必须连接到数据库并生成 SQL 查询的地方再次编写所有这些行。由于我在整个 MVC 框架中拥有大量继承,因此我不必将 Logger 作为某些父类包含在内。只需将其与“use”关键字一起放入任何应该能够将日志信息发送到数据库的类中即可。 同样的事情对我来说也适用于调试消息,我只需写这样的东西: $this->debug("WARNING", $message); 我的调试特征正在制作一条格式良好的警告消息:-)希望它有助于理解。 Abstract和Trait类之间唯一的共同点是无法单独实例化a Trait/an Abstract。 但他们的目的不同。 Trait 仅旨在以细粒度且一致的方式对功能进行分组。它是通过使开发人员能够在生活在不同类层次结构中的多个独立类中减少单继承的一些限制,其中类只是提供一种继承模板并强制继承类实现抽象方法。

回答 4 投票 0

通过宏对所有无符号整数实现特征

我一直在编写一个数据存储模块作为技术练习,以掌握一些基本的 Rust,但我在实现将不同类型转换为特征的过程中遇到了一些问题......

回答 1 投票 0

将泛型中的 Box<T> 转换为 rust 中的 Box<dyn Trait>

>到容器> //例子 fn 主() { 让容器:Container> = Contai...

回答 2 投票 0

具有默认特征实现的 Rust 泛型

我正在开发一个 Rust 项目,在该项目中我定义了几个特征(A1、A2 和 A3),每个特征都有多个实现。我还有一个 struct Algo,它采用基于这些特征的泛型。我

回答 1 投票 0

如何从 Rust 中的 Trait 调用继承的方法

pub mod 的东西{ pub 特征 Clone2:克隆 {} 为 Vec {} 实现 Clone2 } fn 主() { 让 x: Vec = Default::default(); 让 _ = 东西::Clone2::clo...

回答 1 投票 0

结构体中未推断默认泛型类型参数

我有一个泛型结构 Test,它具有实现特征的默认泛型类型参数。这是我的代码: 酒吧特质实施{ fn 测试(); } pub 结构 FirstImpl; impl 实现

回答 1 投票 0

如何从特征对象获取对具体类型的引用?

如何从以下代码中的 a 变量获取 Box 或 &B 或 &Box: 特征 A {} 结构B; 为 B 实现 A {} fn 主() { 让 mut a: Box = Box::new(B); 让...

回答 3 投票 0

无法实现整数类型的通用 fn

我在 C++ 方面经验丰富,并开始尝试 Rust。 尝试实现一些简单的通用函数时,我遇到了以下问题: 使用 std::ops::BitAnd; 使用 std::cmp::Eq;

回答 1 投票 0

所有特征对象的默认特征方法实现

我有一个特征 MyTrait,并且我希望所有特征对象 &dyn MyTrait 都可以相互比较,并且不能与其他任何东西进行比较。我现在基于如何测试特征对象之间的相等性?。

回答 1 投票 0

按元素类型过滤向量

有没有办法实现下面的功能? 特征 X {} 结构体A; 结构B; 为 A 实现 X {} 为 B {} 实现 X /// 只保留A类型的元素 fn 过滤器(列表:Vec>)->...

回答 1 投票 0

为什么类似 Deref 的特征不能组合?

在此代码中,MyDeref 与标准库中 Deref 的定义匹配,MemoryView(从更复杂的示例简化而来)也几乎如此。 酒吧特质 MyDeref { 输入目标:?S...

回答 1 投票 0

在具有异步函数的特征实现中使用宏

这是在特征中使用异步函数的最小示例: 使用 async_trait::async_trait; 宏规则!默认_f { () => { 异步 fn f() -> i32 { 0 } }; } #[async_trait]...

回答 1 投票 0

在实现 Scala 特征或抽象类的案例类中使用默认值

有没有办法让此代码的版本使用特征中定义的默认值? Trait A { // 或者`抽象类A` def x: 字符串 def y: 整数 = 1 } 最终案例类别 B(x: ...

回答 1 投票 0

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