问题标签 [traits]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2066 浏览

c++ - 根据模板参数使用不同的函数集(C++ 特征?)

我在 C++ 中定义了一个类,它包含一个类型的标量数组T,我想为其定义诸如 sin、cos 等运算符。为了定义sin应用于此类的对象的含义,我需要知道sin应用于的含义单一的标量类型T。这意味着我需要在T类中使用适当的数学库(对应于标量类型)。这是现在的代码:

目前,我的代码公开了适当的数学库(使用命名空间 std;),然后::sin(a)在我的类的 sin 函数中使用MyType。虽然这有效,但它似乎是一个重大的黑客攻击。

我看到 C++ 特征可用于存储实例特定信息(例如使用哪组数学函数 when Tis double, when TisBigNum等)

我想做这样的事情:(我知道这不会编译,但我希望这能传达我想要做的事情)

然后将我的 MyType 类重新定义为:

然后traits::math::sin在我的朋友功能中使用。有没有一种方法可以获得T包含数学函数的正确命名空间(由 参数化)?

0 投票
1 回答
1633 浏览

c++ - 整数特征(is_integer,is_integral)

我需要关于整数的两个特征。

  1. 第一个类似于std::is_integral(or boost::is_integral),但可用于用户定义的类型(例如,包装 an 的类int,例如int_wrapper):如果该类型的行为类似于整数并且其表示类似于标准整数类型(例如sizeof(T) * CHAR_BITS == std::numeric_limits<T>::digits,如果T是无符号的) ,则为 true整数类型的定义非常严格,因为它由这些类型的列表组成。所以专业化std::is_integral似乎很困难,如果不被禁止的话(尽管我认为没有明确说明):is_integral是“主要”类型特征(20.7.4.1,注 3:对于类型 T,恰好一个主要类型特征是正确的,在我的情况下int_wrapper已经is_class等于为真)。如果我专门研究这个特征,我会承担什么风险int_wrapper?你知道适合我需要的特质类(例如在 Boost 中)吗?

  2. 我需要的第二个特征是具有整数语义的类型(使用位算术运算、位操作等)。例如mpz_classfrom GMP 将满足此特征。std::numeric_limits<T>::is_integer适合这个特质吗?我读到可以专门化和设置numeric_limits<T>::is_integer == trueifT行为像一个整数,而且(在 C++ 标准中)术语“整数”和“整数”是同义词(在这种情况下,我们总是有numeric_limits<T>::is_integer == is_integral<T>::value

总之,我是更好地为我的精确需求定义自己的特征,还是尝试扩展标准的特征?

0 投票
5 回答
6706 浏览

scala - Scala immutable objects and traits with val fields

I would like to construct my domain model using immutable objects only. But I also want to use traits with val fields and move some functionality to traits. Please look at the following example:

Unfortunatelly such code doesn't work - copy method is unknown for trait Versionable.

I think that it would be nice to have copy method generated for every trait and class. Such method should create shallow copy of object and return it using the same type as for original object with given field modified accoring to arguments passed to method.

So in the following example:

customer.changeName("McDonnald") should return an object instance Customer(version = 0, name = "McDonnald")

and

customer.incrementVersion should also return an object instance Customer(version = 1, name = "Scot")

As far as I know current lack of such functionality in Scala doesn't allow to use immutable classes and traits without polluting class constructor with trait fields. In my example I don't want to introduce parameter named version to Customer class because functionality of version handling I want to have encapsulated in Versionable trait.

I know functionality of copy method in case classes and ability to write own copy method in class using default parameters - but I think that this functionality doesn't solve my problem because it is not possible to use such copy method in traits. Another drawback of existing functionality is that parent class using copy method returns parent class and not class of object that is actually copied.

My questions:

1) do you have idea how to handle above example in elegant way. I'm quite new to Scala so maybe there is good solution already. In my opinion elegant solutions should have following features:

  • should not use reflection

  • should not use serialization

  • should be fast

  • should be verifiable in compile time

2) what do you think about writing compiler plugin to generate code for copy method for my above example? Is it possible to do that using compiler plugin? Do you have any examples or tips how to do that?

0 投票
1 回答
383 浏览

scala - 扩展内置集合,内置方法的问题

我是一个 Scala 新手,如果这是一个愚蠢的问题,请原谅我,但是这里有......

想象一下,我希望创建一个包含附加方法的扩展 Map 类型。我可以看到一些方法来做到这一点。第一个是组合:

另一个是通过继承,例如

最后,我还考虑了“特质”路线,例如

构图有点尴尬,因为你必须经常引用里面的东西。继承是相当自然的,但对我来说有一个皱纹(稍后会更多)。Traits 似乎是一种非常优雅的方法,使用“with”结构非常好,但对我来说也有问题。

我遇到的问题是使用 ++ 之类的方法。他们返回一张新地图。所以假设上面提到的“我的方法”希望在地图上添加一些东西(只是一个例子,我知道地图已经有了这个),例如

这会产生错误,因为返回类型不是 Path[V]。现在我知道我可以在新实例上使用“with”来添加 Path[V] 特征。但我不控制这里新地图的构建。有没有办法添加 Path[V] 特征?我考虑过创建一个预先填充的新不可变地图,然后在“with Path[V]”上进行标记,但是没有这样的构造函数可以用来创建预先填充的地图。

我怀疑(尽管我还没有确认)使用继承我会遇到类似的问题。我可以添加一个新方法来向地图添加一个新条目,但我不会得到我想要的“路径 [V]”。组合的方法似乎是去这里的唯一途径。

我希望这很清楚。评论?

0 投票
3 回答
150 浏览

perl - 我可以订购作为特征的一部分加载的顺序方法修饰符吗?

这是对上一个问题的跟进。如果我有多个带有around修饰符的插件/特征,是否可以确保特定的执行顺序(看看我如何不确定哪个会实际加载)?还是我真的只能在我编写的代码和文档中控制它?

示例:我有 3 个角色,每个角色都有一个around,每个角色都可以作为一个Trait加载,但如果加载超过 1 个,则必须按特定顺序加载它们才能正常工作。例如,按该顺序加载 Trait ABC 可以正常工作,但像 Trait BAC 一样加载它会导致行为不稳定。

有没有办法可以防止用户(程序员)以错误的顺序加载它们。

0 投票
1 回答
423 浏览

generics - scala有没有办法在没有示例实例的情况下生成通用实例?

我正在创建一个通用工厂,如下所示:

'new T()' 不会编译,因为 T 在运行时之前是未定义的。我知道我可以通过将类的实例传递给某个方法来使其工作(即 createInstance(classOf[Date]) )

我在问是否有一些内省魔法可以取代'new T()',这样我就可以创建我的超级简单工厂?

0 投票
1 回答
5850 浏览

scala - 案例类别和特征

我想创建一个特殊的计算器。我认为这case class对运营来说是个好主意:

现在我可以使用 match-case 来解析输入。也许,我也应该使用traits(即:trait Distributivitytrait Commutativity),这可能吗?这是一个好主意吗?

0 投票
4 回答
4912 浏览

c++ - 类型到 int 的映射

我有两个 c++ 程序需要有一个type -> int在编译时已知并且在两个程序之间相等的映射。此外,我想在编译时自动确保地图是一对一的。你会怎么解决?(允许使用 c++0x 扩展)。第一部分很简单:分享一个

程序之间。(第二部分意味着我不想val在我的程序中的某个地方意外地为两种不同的类型定义相同的内容。)

0 投票
2 回答
221 浏览

scala - 案例类是否允许使用构造函数?

我有一个案例类(让我们命名它Stuff),我希望能够通过扩展特征(称为它Marker)在运行时创建匿名子类。这是一个 REPL 会话的片段,它说明了我正在尝试做的事情:

请注意如何a使用 实例化Stuff.apply(),而在b“案例”中,我正在调用案例类的构造函数。

我的问题是:是否使用构造函数来实例化案例类?在我看来确实如此,因为案例类提供的通常便利,例如==.equals().hashCode(),都可以工作。我是否错过了任何会标记我正在做的坏事 (TM)的事情?

0 投票
1 回答
3433 浏览

scala - Scala 初始化行为

请看下面的代码。

为什么在MyClass和的情况下初始化顺序不同MyClass2MyClasswill的构造函数为

MyClass2will的构造函数是

我认为初始化顺序应该和MyClass2构造函数一样,两种情况都一样。