traits 相关问题

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

如何克隆存储装箱特征对象的结构?

我编写了一个具有 Animal 特征和实现该特征的 struct Dog 的程序。它还有一个 AnimalHouse 结构体,将动物存储为特征对象 Box。 特质动物{ 芬...

回答 3 投票 0

Laravel 动态扩展或使用 Traits

可以在运行时扩展或使用不同的类吗? 例子: 假设我们有一个名为 Player 的模型(我们的 A 模型) 可以在运行时扩展或使用不同的类吗? 示例: 假设我们有一个 model 称为 Player(我们的 A 模型) <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Player extends Model{ } 我们还有另外 2 个型号(B 和 C 型号) <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; protected $connection= 'db_b'; class PlayerInfoB extends Model{ function getName(){ return $this->name; } } 我们的C型号 <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; protected $connection= 'db_c'; class PlayerInfoC extends Model{ function getName(){ return $this->name_g; } } 模型A (Player)如何在运行时根据配置或其他数据扩展Model B or C 为什么我需要这个。 我有 2 个或更多不同的表,这些表的列有不同的名称,例如: Table 1 - name Table 2 - name_g Table 3 - name_full 所以我需要一个可以随时调用的包装器getName(),而无需检查现在使用的表。 $player = Player::get(); echo $player->getName(); 如果有不清楚的地方,请评论,我会更新我的问题。 更新基于madalin-ivascu答案可以这样完成吗? class Player extends Model{ protected $model; public function __construct(){ $this->setModel(); parent::__construct(); } protected function setModel(){ $this->model = $this->column_model_name } function getAttributeName(){ return $this->model->getName(); } } 如果不使用 eval 或 dirty hacks,就不可能在运行时编写一个类。您必须重新考虑您的类设计,因为您不太可能需要通过良好的设计来做到这一点。 您可以做的是使用方法 setTable 和 on: 在运行时更改模型实例上的表和数据库连接 Player::on('db_b')->setTable('player_info_b')->find($id); 另一种方法(首选)是定义模型 PlayerInfoC 和 PlayerInfoB 来扩展您的 Player 模型,然后根据您的情况在需要时实例化类 B 或 C。 在您的代码中,您的脚本必须具有您检查的状态,以便知道何时使用正确的模型? 既然如此,为什么不在 get name 中使用参数呢? class Player extends Model{ function getName($field){ return isset($this->{$field}) ? $this->{$field} : null; } } 如果你经常这样做,那么使用魔法方法: class Player extends Model{ function __get($key){ return isset($this->{$field}) ? $this->{$field} : null; } } ... echo $myModelInstance->{$field}; http://php.net/manual/en/language.oop5.overloading.php#object.get 在 Laravel 中,当你通过集合方法拉回数据时,它无论如何都会执行这个神奇的方法,因为所有属性都存储在称为属性的嵌套对象中,因此 __set() 和 __get() 看起来像这样: function __get($key){ return isset($this->attributes->{$key}) ? $this->attributes->{$key} : null; } function __set($key, $value){ return $this->attributes->{$key} = $value; } 建议后者带有属性子集,这样可以防止数据与返回的数据库列名称与模型中已使用的名称发生冲突。 这样,您只需在创建的每个模型中将一个属性名称作为保留名称进行管理,而不必担心您使用的数百个 var 名称会覆盖模型或模型扩展中的另一个属性名称。 使用该模型值来调用函数 $player = Player::get(); echo Player::getName($player->id,'PlayerInfoC'); 在 Player 模型中您只需调用 public static function getName($id,$class) return $class::where('player_id',$id)->getName();//each class will have the function } ps:您需要进行一些验证来测试该名称是否存在 另一种选择是在模型之间创建关系 您可以在模型中使用与以下相同的启动方法来执行此操作: protected static function booted() { if (<--your condition-- >) { $traitInitializers[static::class][] = 'boot' . ExampleTrait::class; $traitInitializers[static::class][] = 'boot' . Organizations::class; } }

回答 4 投票 0

如何允许在各种类型的 IntoIterator 项上多次实现同一个特征?

Rust 似乎仅在关联类型不同时才区分特征的不同实现。 如何在各种集合/迭代器上实现方法,但有

回答 2 投票 0

为什么 Iterator<Item = T> 和 Iterator<Item = &T> 的实现会发生冲突?

此代码无法编译: 酒吧特质 ToVec { fn to_vec(self) -> Vec; } 为 I 实现 ToVec 在哪里 我:迭代器, { fn to_vec(self) ...

回答 4 投票 0

当函数中包含一个返回 impl 特征的方法时,如何动态地从函数返回 impl 特征?

如以下代码所示: 特征 T2impl {} 结构S4T2impl; S4T2impl 的 impl T2impl{} 特质 TimplMethod { fn f() -> impl T2impl; } 结构体S4TimplMethod; 实现 TimplMethod...

回答 2 投票 0

Rust,编写一个泛型函数来定义自己的类型

如果我想要一个泛型函数返回一个泛型结构体,其类型是基于某个参数定义的,我该如何实现呢? 我尝试如下: 结构体A{ 值:T } 我...

回答 1 投票 0

如何指定 Rust 特征边界的多种可能性

我正在尝试编写一个函数,它将任何可迭代的泛型类型作为输入并循环遍历元素。这是一个工作示例 pub fn test1<'a, IterableT, ItemT>(节点:&'a

回答 1 投票 0

当我还控制上游板条箱时,如何解决“上游板条箱可能添加新的特征实现”错误?

假设我的工作区中有 2 个库 crate:A 和 B。在 crate A 中,我创建了一个公共结构 StructA。板条箱 B 依赖于板条箱 A,并且在 src/lib.rs 中有以下代码: 使用 A::StructA; 结构S...

回答 1 投票 0

是否可以计算出 lambda 的参数类型和返回类型?

给定一个 lambda,是否可以计算出它的参数类型和返回类型?如果是,怎么办? 基本上,我想要 lambda_traits 可以通过以下方式使用: 自动 lambda = [](int i) { 返回...

回答 6 投票 0

通用数据类型的特征边界

我正在尝试为平面几何形状(例如梯形和三角形)实现一个称为“区域”的基本特征。当我将数据类型修复为 f32 时,该代码有效。但一旦我尝试转换它

回答 2 投票 0

Rust:通用数据类型的特征边界

我正在尝试为平面几何形状(例如梯形和三角形)实现一个称为“区域”的基本特征。当我将数据类型修复为 f32 时,该代码有效。但一旦我尝试转换它

回答 1 投票 0

从函数到定义为可变引用的变量的赋值?

我正在尝试实现 ode_solvers 箱来整合我的方程组。为此,我有一个函数来计算 dydx 是什么,然后我在

回答 1 投票 0

索引器的默认实现[重复]

我下面的代码有什么问题,或者,如果默认情况下不使用默认索引器实现,那么它的意义何在? 公共接口 IFoo { 字符串这个[字符串键] { get => &

回答 1 投票 0

Mixin 和/或 Traits 有哪些很好的例子?

我正在阅读 Ruby,并了解了它的 mixins 模式,但想不出许多有用的 mixin 功能(因为我很可能不习惯这种方式思考)。所以我想知道什么

回答 4 投票 0

是否可以在运行时向 PHP 中的类添加特征?

简单的问题,是否可以在运行时动态向 php 类添加特征而不使用 eval?

回答 2 投票 0

访问类依赖的特征是一个坏主意吗?

我在 Stackexchange 上看到过一个例子(请注意访问类属性的特征): 特征检查权限特征 { 受保护函数 checkPermission($object_id) { $法官=$

回答 3 投票 0

限制超级特征中的关联类型

在下面的(非常简化的)示例中,我有一个 UnboundBuffer 和一个 BoundBuffer 特征。 UnboundBuffer可以绑定到Memory来创建BoundBuffer。这种绑定是通过

回答 1 投票 0

从特征方法返回特征对象时无法推断适当的生命周期

我正在尝试制作类似不可变字典特征的东西,可以在不影响以前版本的情况下添加新项目(引用)并使用它。最小的例子: #[派生(克隆)] 酒吧街...

回答 1 投票 0

为特征实现通用函数,可以对不同的数字类型进行操作

是否有更好的方法来实现基本数字类型的通用转换函数?我一直在努力创建一个更通用的特征版本,它将 LE 字节流转换为规范......

回答 1 投票 0

rust - 为特征实现通用函数,可以对不同的数字类型进行操作

是否有更好的方法来实现基本数字类型的通用转换函数?我一直在努力创建一个更通用的特征版本,它将 LE 字节流转换为规范......

回答 1 投票 0

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