问题标签 [enrich-my-library]

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 回答
618 浏览

scala - Scala 中用于具有继承返回类型的集合的最小框架

假设一个人想要构建一个新颖的泛型类,Novel[A]. 这个类将包含许多有用的方法——也许它是一种集合——因此你想继承它。但是您希望方法返回子类的类型,而不是原始类型。在 Scala 2.8 中,为了使该类的方法返回相关子类而不是原始子类,需要做的最少工作量是多少?例如,

如果你想Novel协变,这个最小量会改变吗?

(除其他外,2.8 集合做到了这一点,但它们也以更花哨(和有用)的方式使用返回类型——问题是如果一个人只想要这个子类型-总是-返回-子类型,那么可以摆脱多少框架特征。)

编辑:假设在上面的代码中reverse进行了复制。如果进行就地修改然后返回自己,则可以使用this.type,但这不起作用,因为副本不是this

Arjan 链接到另一个建议以下解决方案的问题:

这基本上取决于类型系统以获得我们想要的东西。但这并不是一个真正的解决方案,因为既然我们对类型系统撒了谎,编译器就无法帮助我们确保当我们认为我们确实得到ShortStory回报时。(例如,我们不必reverse在上面的示例中重写以使编译器满意,但我们的类型不会是我们想要的。)

0 投票
3 回答
2550 浏览

scala - 在参数化类中混合通用特征而不复制类型参数

假设我想创建一个可以混入任何 Traversable[T] 的特征。最后,我希望能够说以下的话:

并在 MoreFilterOperations 上具有以 Traversable 必须提供的任何内容表示的方法,例如:

但是,问题显然是 T 没有定义为 MoreFilterOperations 上的类型参数。一旦我这样做了,它当然是可行的,但是我的代码将显示为:

或者如果我定义了这种类型的变量:

根据我的口味,这是一种冗长的方式。我希望以这样的方式定义特征,以便我可以将后者写为:

我尝试了自我类型,抽象类型成员,但它没有产生任何有用的东西。有什么线索吗?

0 投票
3 回答
6658 浏览

scala - 如何将丰富我的库模式应用于 Scala 集合?

Scala中最强大的模式之一是enrich-my-library* 模式,它使用隐式转换来将方法添加到现有类,而不需要动态方法解析。例如,如果我们希望所有字符串都有spaces计算它们有多少空白字符的方法,我们可以:

不幸的是,这种模式在处理泛型集合时遇到了麻烦。例如,已经询问了许多关于使用 collections 对项目进行顺序分组的问题。没有任何东西可以一次性使用,所以这似乎是使用泛型集合C和泛型元素类型的丰富我的库模式的理想候选者A

当然,除了它不起作用。REPL 告诉我们:

有两个问题:我们如何C[C[A]]从一个空C[A]列表(或凭空而来)得到一个?以及我们如何C[C[A]]从线路中获得 a backsame +:而不是 a Seq[Seq[A]]

*以前称为 pimp-my-library。

0 投票
1 回答
407 浏览

scala - 通过使用自己的方法扩展 TraversableLike 来丰富我的库

我尝试用自己的方法扩展 TraversableLike,但失败了。

首先,看看我想要实现的目标:

这段代码工作正常,它计算出列表元素之间的差异。但我想要这样一个代码,它可以与等一起使用SeqSet而不仅仅是List.

我试过这个:

有几个错误。无论是隐式转换还是++-method工作。另外,我不知道如何创建新类型 CC - 请参阅循环调用。

0 投票
3 回答
340 浏览

scala - 使用方法丰富 Scala 集合

如何foreachWithIndex在 Scala 集合上添加方法?

到目前为止,这是我能想到的:

这不起作用:

引发以下错误:

但是,当我明确应用转换方法时,代码可以工作:

输出:

如何在不显式应用转换方法的情况下使其工作?谢谢。

0 投票
1 回答
156 浏览

class - 为什么我可以将方法标记为隐式而不是构造函数?

常见的 Enrich-My-Library 模式似乎类似于

为什么不能implicit像这样将其添加到构造函数本身

考虑到构造函数只不过是一个带有一些额外限制的方法?

令人惊讶的是,以下方法确实有效:

0 投票
1 回答
70 浏览

scala - 如何在Scala中定义从一种到另一种现有类型的隐式转换?

假设我们Foo在使用的库中有一个类,并且希望(在我们的代码文件中)实例在需要实例的地方遇到实例时Foo隐式转换为实例。如何在 Scala 中实现这一点?StringFooString

0 投票
2 回答
427 浏览

scala - 重载现有的 `toInt` 方法

toIntin 方法不带任何参数,StringLike只能解析十进制。因此,要解析二进制、十六进制等,我们需要求助于 Java 的Integer#parseInt(String s, int radix).

为了纠正这种情况,我尝试了以下方法

然而,

导致 REPL 编译器“严重崩溃”并且在编译后的代码中也不起作用。

使用“丰富我的库”模式重载现有方法是否有一些限制?

0 投票
1 回答
812 浏览

scala - 如何将采用隐式排序的方法添加到 scala 集合对象

我正在尝试使用带有隐式排序的 scala 集合方法来丰富我的库模式。

鉴于此定义:

这个测试怎么来的:

给我这个编译错误?

错误:没有为 AnyVal {def getClass(): java.lang.Class[_ >: Int with Double <: AnyVal]} 定义隐式排序。val mx = List(1, 2, 7, 1, 4, 8, 2, 5, 47, 2, 7).myMinBy(_.toDouble)

0 投票
3 回答
291 浏览

scala - 使用enrich-my-library 对匿名函数进行类型推断

假设我有一个方法可以将(两个元素上的函数)转换为(两个序列上的函数):

换句话说,结果函数接受两个序列xsand ys,并创建一个由(xs(0) f ys(0), xs(1) f ys(1), ...) So 组成的新序列,例如,如果xssisSeq(Seq(1,2),Seq(3,4))fis (a: Int, b: Int) => a + b,我们可以这样调用它:

或使用匿名函数:

这很好;摆脱[Int]类型参数会很好,但我不知道如何(任何想法?)。

为了让它感觉更像这种tupled方法,我还尝试了丰富我的库模式:

对于预定义的函数,这很好用,但匿名函数很难看

有没有另一种方法可以重新制定它以便推断类型,并且我可以使用类似的语法:

? 还是我对类型推断的要求太多了?