traits 相关问题

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

修改 Axum 处理程序主体时不再满足无法解释的特征界限

最近,我开始学习 Rust,用 Axum 构建一些简单的 Web 应用程序。然而,我在构建应用程序时遇到了无法解释的错误,并且找不到原因。 失败的...

回答 1 投票 0

通过引用实现特征关联类型的生命周期

我有一个具有关联类型的特征,但我想用引用类型来实现它,但是我无法获得正确的生命周期。 例如,如果没有参考文献,假设我有: 特质DoesStuff {...

回答 1 投票 0

使用“通用”数据存储命令结构

我有以下特点: pub 特征命令 { /// 预期的参数。 类型有效负载; /// 返回命令 ID。 fn id(&self) -> &'static str { “0”...

回答 1 投票 0

Laravel:如何在创建和更新期间从特征访问原始输入?

我正在为 Laravel 雄辩模型编写一个 Trait,它可以在创建和更新期间“提升”输入元素。基本特征如下所示: 我正在为 Laravel 雄辩模型编写一个 Trait,它可以在创建和更新期间“提升”输入元素。基本特征如下所示: <?php namespace App\Traits; use Illuminate\Database\Eloquent\Builder; trait PromotesInputsDuringCreation { public static function doPromotion($attrs) { if (isset(static::$promotions) && !empty(static::$promotions)){ foreach (static::$promotions as $target => $path) { $pathParts = explode('.', $path); $targetData = $attrs; foreach ($pathParts as $part){ if (is_null($targetData)) { break; } $targetData = is_object($targetData) ? $targetData->$part : $targetData[$part]; } if(!is_null($targetData)) { $attrs[$target] = $targetData; } } } return $attrs; } 实现该特征的模型将定义一个 $promotions 数组,如下所示: public static $promotions = [ 'loan_status_end_date' => 'loan_status.end_date', 'loan_status_type' => 'loan_status.type' ]; 此特征的目标是接受带有充满数据的嵌套数组/对象的输入,并有选择地将数据中的“一些”提升为新的顶级键。保存后,这可以更轻松地在数据库级别进行排序/搜索。 我遇到的问题是,我尝试过的解决方案都没有“能解决所有问题” 第一种解决方案:启动方法 问题:引导方法回调接收已实例化的模型,该模型不包含传递到 ::create() / ::updateOrCreate() /类似方法的原始数据。 (或者,如果有的话,我不知道如何访问它。如果我很笨,请告诉我) 示例代码: public static function bootPromotesInputsDuringCreation() { static::creating(function ($model) { //$model->getDirty() only gets attributes that exactly match data keys $model->attributes = array_intersect_key(self::doPromotion($model->getDirty()), $model->attributes); }); static::updating(function ($model) { //$model->getDirty() only gets attributes that will change in the update $model->attributes = array_intersect_key(self::doPromotion($model->getDirty()), $model->attributes); }); } 第二种解决方案:重写创建方法 问题:推广有效,但以下创建方法跳过了模型转换和我依赖的其他 laravel 细节。所有将 static::create() 或 parent::create() 与升级数据一起使用的尝试都会创建无限循环。示例代码: public static function create($data) { return (new static)->newQuery()->create(self::doPromotion($data)); } public static function updateOrCreate($where, $data) { $data = self::doPromotion($data); if ((new static)->newQuery()->where($where)->exists()) { // this skips $casts and other model events :( return (new static)->newQuery()->where($where)->update($data); } return (new static)->newQuery()->create([...$where, ...$data]); } 我真的感觉我离让这个特质发挥作用还有几英寸的距离。有人看到我缺少什么吗?可能很简单,就像找到一种方法来获取 boot 方法中的原始创建/更新输入,或者以调用这些 Laravel 细节的不同方式在重写的方法中调用创建/更新。 提前致谢。 我认为使用全局观察者对此更好 <?php namespace App\Traits; use Illuminate\Database\Eloquent\Builder; trait PromotesInputsDuringCreation { public static function doPromotion($attrs) {...}; public static function bootPromotesInputsDuringCreation() { static::observe(app(PromotesInputsObserver::class)); } } 您可以创建此 PromotesInputsObserver 并实现您的 creating 和 updating 事件。但由于 getDirty 正在寻找脏属性,并且您的 loan_status 不是模型的属性,因此它不会显示为脏属性。您的 loan_status 永远不会被比较。class PromotesInputsObserver { public function creating(Model $model) { $model::doPromotion($model->only($model::$promotions)); foreach($model::$promotions => $target) { unset($model->$target); } } }

回答 1 投票 0

PHP Trait 静态属性

我有一个扩展 Eloquent\Model 的类。 我想定义一个向类添加静态属性和静态方法的特征。 特质 可搜索 { 受保护的静态数组$searchable; 公开

回答 2 投票 0

如何指定结构体字段必须实现特征?

我有一个特质Foo 酒吧特质 Foo { fn do_something(&self) -> f64; } 以及引用该特征的结构 酒吧结构酒吧{ 富: 富, } 尝试编译我得到 错误:参考

回答 3 投票 0

同时定义 fmt::Display 和 fmt::Debug

是否可以一起定义 fmt::Display 和 fmt::Debug ,即它们使用相同的实现? 假设我们有以下示例代码(纯粹用于演示目的): 使用 std::fm...

回答 2 投票 0

在使用粗粒度锁访问的数据结构中使用 RefCell 是否安全?

我正在编写一些 tokio 异步代码。我有一个多索引数据结构,将用户保留在我想要使用粗粒度锁(与每个对象锁相反)保护他们的位置。我有这样的东西:...

回答 2 投票 0

Rust:在使用粗粒度锁访问的数据结构中使用 RefCell 安全吗?

我正在编写一些 tokio 异步代码。我有一个多索引数据结构,将用户保留在我想要使用粗粒度锁(与每个对象锁相反)保护他们的位置。我有这样的东西:...

回答 1 投票 0

trait方法的返回类型如何设计?

我开始为SKU实现一个实用程序,一个产品需要多个单位。基本逻辑是: 将金额列表转换为带有基本单位的单个金额。 用基本单位分割单个金额

回答 1 投票 0

在特征对象上实现调试

我想在 Post 结构上实现 Debug 特征,该结构有一个特征对象作为值,但我从下面得到堆栈溢出错误: 线程“main”已溢出其堆栈 致命的运行时错误:

回答 1 投票 0

Rust:为什么不使用 &str 的 Into<String>?

考虑这个陈述:U 的 From 意味着 T 的 Into。 让 t =“abc”;并注意 t 的类型为 &str 大家都用过:let s=String::from(t); 这样我们就有:...

回答 2 投票 0

JS 中基于 Mixin 和 Trait 的组合

我在组合和混合方面遇到了一些麻烦。 例如,假设我们有一个 AHero 和 Hero1 对象。 所有英雄都可以移动,所以 AHero.move() 是一个东西。 现在,在开发的某个时刻,我...

回答 1 投票 0

默认实现 self 类型的 Rust 特征方法不是预期的

所以我在 Rust 中有这个文件系统特征 pub 特征文件系统:调试 + 发送 + 同步 在这个特征中,我在这里有一个带有默认实现的方法: fn location_with_sub_path(&self, sub_...

回答 1 投票 0

`HashMap` 的特征边界实际上来自哪里?

正如HashMap文档中提到的,键类型K需要实现Hash、PartialEq和Eq,这是有道理的。 然而,我本以为这些特征界限实际上也会出现

回答 1 投票 0

为什么在特质中返回`Self`可以工作,但返回`Option<Self>`需要`Sized`?

这个特征定义编译得很好: 特质作品{ fn foo() -> 自身; } 然而,这确实会导致错误: 特征错误{ fn foo() -> 选项; } 错误[E0277]:尺寸...

回答 3 投票 0

如何在TypeGraphQL中使用mixins来复制“特征”并扩展类型?

我正在尝试将 PHP 中的“特征”概念复制到 TypeGraphQL 类型中。然而,在抽象类和 mixins 之间,我有点迷失了,甚至无法弄清楚什么是谷歌...... 我

回答 1 投票 0

当只有 T 具有特质 impl 时处理 &T

假设我有这个特质: 酒吧特质 DoSomething { fn do_it(值:自身); } 我为某些类型实现了它: 为 i32 实现 DoSomething { // ... } impl<'a> DoSomething for &'a

回答 1 投票 0

获取抽象类型的名称

我正在尝试创建一个特征,该特征将提供在子类中添加的抽象类型的名称: 特质 T { T型 def myClassOf[T:ClassTag] = 隐式[ClassTag[T]].runtimeClass ...

回答 2 投票 0

如何在 Rust 中编写一个通用方法,它可以接受任何可以转换为另一个值的值?

我希望能够在通用函数中接收类似路径的值。我的想法是,我希望能够接收任何可以转换为 PathBuf 的内容,如下所示: fn 构建... 我希望能够在通用函数中接收类似路径的值。我的想法是我希望能够接收任何可以转换为 PathBuf 的东西,如下所示: fn build<P>(path: P) -> Some<Handler>{ let mut base_path = PathBuf::from(path); ... } 但是,当然,如果没有适当的特征,这是行不通的。然而,我无法弄清楚如何编写通用特征,表明我想要接受一个可以被另一种类型接受为 from 的值。像这样(这当然行不通): fn build<P>(path: P) -> Some<Handler> where P: PathBuf::from::<P> { let mut base_path = PathBuf::from(path); ... } 对于您想要“转换为任何内容”的情况,正确的特征是Into。 但是,接受路径的惯用特征是AsRef<Path>。 fn build<P>(path: &P) where P: AsRef<Path> 或更短的形式: fn build<P: AsRef<Path>>(path: &P) 或更短: fn build(path: &impl AsRef<Path>) 如果你的函数并不简单,你应该立即转向非泛型函数: fn build(path: &impl AsRef<Path>) { build_impl(path.as_ref()) } fn build_impl(path: &Path) { .... } 如果您需要 PathBuf,只需拨打 to_owned() 上的 Path即可。 作为参考,您可以使用与 Into 相同的技术,但没有参考: fn build(p: impl Into<PathBuf>) { build_impl(p.into()) } fn build_impl(p: PathBuf) {}

回答 1 投票 0

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