在计算机编程中,特征是一组方法,用作“构建面向对象程序的简单概念模型”
从 php 中的特征访问类常量会在 VScode 中出现错误
我在 laravel 中的同一个 App 文件夹中有一个类和一个特征 我的类.php 我在 laravel 中的同一个 App 文件夹中有一个类和一个特征 MyClass.php <?php namespace App; class MyClass { use myTrait; CONST MY_CONST = 'CONST'; public function showConst() { echo $this->myTraitMethod(); } } MyTrait.php <?php namespace App; class MyTrait { public function myTraitMethod() { return self::MY_CONST; // Undefined class constant 'MY_CONST' return static::MY_CONST; // Undefined class constant 'MY_CONST' return MyClass:MY_CONST; // This is the only one that works but I'm forcing the class name } } 问题是我无法访问 MY_CONST 除非我强制使用父类名称,这对我来说不是解决方案。 更新 问题出在 vscode 上,我的意思是代码在 self 和 static 下都运行良好,但 vscode 返回错误 Undefined class constant 'MY_CONST' 我更新了问题标题以匹配实际问题 在 PHP 中,特征充当可重用的代码块,可以包含在多个类中。这种方法允许开发人员在各个类之间共享方法,而不受继承的限制,继承仅支持单个父类。然而,有一个缺点:特征不能直接引用包含它们的类中定义的常量。存在这种限制是因为常量特定于每个类,并且对于特征本身并不可见。 在您的原始设置中: 您有一个名为 MyClass 的类,它定义了常量 MY_CONST。 您想在名为 MyTrait 的特征中使用此常量。 但是,直接从特征访问 MY_CONST 会导致错误,除非类名被硬编码,这具有限制性并降低了特征的灵活性。 解决方法 为了解决这个问题,我们可以在特征中引入一个抽象方法。抽象方法不包含任何实现,但强制任何类使用该特征来定义它。通过这样做,我们创建了一种方法,让类将常量的值传递给特征,而特征不需要直接访问常量本身。
Rust 支持特征继承,如下: 酒馆特征 A {} 酒吧特质 B: A {} B:A意味着如果某个类型T实现了B,那么它也需要实现A中的所有方法。 但今天我看到了以下...
我正在用 Rust 编写一个玩具数据库实现,但我无法绕过这个对象安全的特征要求。我基本上想要一种表示具有
我有以下 Rust 代码。 特征 X<'a> { fn x(&self) -> &'a [f64]; } 结构拥有{ x:Vec, } 结构参考<'a> { x: &'a[f64], } 我愿意
我想编写一个接受具有 ToString 特征的类型的迭代器的函数。 我的想法是: fn parse(mut args: T) -> 结果 我想编写一个函数,接受具有 Iterator 特征的类型的 ToString。 我的想法: fn parse<T: Iterator /* ?T::Item : ToString? */>(mut args: T) -> Result<String, String> { match args.next() { Some(x) => x.to_string(), None => String::from("Missing parameter"), } } 是的,您可以使用 where 子句来做到这一点: fn parse<T: Iterator>(mut args: T) -> Result<String, String> where <T as Iterator>::Item: ToString, { // .... } 或者,由于这里 Item 的含义是明确的,因此界限可以是: where T::Item: ToString 您可以使用 Item = 语法: fn parse<I: ToString, T: Iterator<Item = I>>(mut args: T) -> Result<String, String> 这允许您使用 impl 语法进一步简化: fn parse<T: Iterator<Item = impl ToString>>(mut args: T) -> Result<String, String> 最后: fn parse(mut args: impl Iterator<Item = impl ToString>) -> Result<String, String> 我认为这是一个更具可读性的替代方案。 从 Rust 1.79 开始,您可以将绑定直接放置在关联的 Item 类型上,因此您可以像这样定义 parse(): fn parse<T: Iterator<Item: ToString>>(mut args: T) -> Result<String, String> { ... } 甚至像这样: fn parse(mut args: impl Iterator<Item: ToString>) -> Result<String, String> { ... }
我想创建一个特征来定义一个常量 LEN 和一个长度为 LEN 的数组作为特征函数的输出类型,但我不允许: 特征 TransformIntoArray { const LEN:使用;
在 Trait 中要求所有 Iterators<Item = Self> 都实现 Trait
非常具体地,我有 LogSumExp 特征,它是为所有 Iterator 和 Iterator 实现的 我有自己的 Trait FloatTrait,它仅针对 f32 实现...
所以我的问题是我有一个输入和输出类型如下的图层特征: 酒吧特质层{ 类型输入:尺寸; 类型输出:尺寸; fn 前进(&mut self,输入:&...
假设我有实现 Foo 特征的结构 F1 和 F2。 现在我想编写一个接受 Foo 并返回 Bar 的函数。 特质 Foo { fn get_bar(&self) -> &Bar } fn do_ma...
在 Rust 中,如何编写一个特征来表达创建一个与 self 的引用一样长的对象的能力?
我有点失去理智了。 我想表达一个特征,保证类型能够从引用(&'a self)创建另一个类型“Item”,该引用与
使用 AsRef<Path> 时出错:预期类型参数 `P`,找到 `&Path`
我一直很喜欢编写使用 AsRef 作为参数类型的 API,从那时起,调用函数就不必担心它是否有 str、String、PathBuf、Path 或其他什么,...
当一个特征必须为“Sized”时,如何对向量中的多个特征使用“dyn”关键字?
我的问题是:我有一个函数 do_something,它需要一个对象向量。这些对象可以是不同的类型,但它们都必须实现特征 A 和 B。 我声明了 A 的例子...
我正在编写一个命令行任务管理应用程序来自学 Rust。 到目前为止我有一个 sqllite 和一个内存数据源。 pub 结构任务管理器 { source: Datasource, // 这里 rustc 抱怨 }
考虑以下代码: 使用 std::{cell::RefCell, rc::Rc}; 特征我的特征{ fn my_func(&mut self) {} } 结构体MyStruct; 为 MyStruct 实现 MyTrait {} fn 主() { 让 my_ref=Rc::new(重新...
如何检查 T 或 Any 是否实现了 Rust lang 中的特征
我刚刚开始使用 Rust,需要一些帮助来理解语言中的类型检查。我正在尝试引入一个活动记录器来捕获和记录
上下文 我有一个谓词特征。它采用某种类型 T 并为其返回一个布尔值。 特质谓词 { fn 评估(&self, t: &T) -> bool; } 我也有评估员
我想知道在当前的 PHP 5.4 实现中是否有任何充分的理由可以解释为什么这种行为是可能的: 特质 T { 公共函数测试(PDO $pdo) {} } C类{ 使用T; 公开
假设我有这个代码: 酒馆特征 A {} 酒馆特征 B {} 酒吧特质 SomeBehavior { fn func() -> 布尔; } 我想为 A 和 B 提供一揽子实现,如下所示: 实现
我想为 &'a str 和最大 i32 的整数实现自定义特征,但 Rust 不允许我这样做: 使用 std::convert::Into; 酒吧特质 UiId { fn 推(&self); } 暗示<'a...