问题标签 [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.
scala - Scala 中用于具有继承返回类型的集合的最小框架
假设一个人想要构建一个新颖的泛型类,Novel[A]
. 这个类将包含许多有用的方法——也许它是一种集合——因此你想继承它。但是您希望方法返回子类的类型,而不是原始类型。在 Scala 2.8 中,为了使该类的方法返回相关子类而不是原始子类,需要做的最少工作量是多少?例如,
如果你想Novel
协变,这个最小量会改变吗?
(除其他外,2.8 集合做到了这一点,但它们也以更花哨(和有用)的方式使用返回类型——问题是如果一个人只想要这个子类型-总是-返回-子类型,那么可以摆脱多少框架特征。)
编辑:假设在上面的代码中reverse
进行了复制。如果进行就地修改然后返回自己,则可以使用this.type
,但这不起作用,因为副本不是this
。
Arjan 链接到另一个建议以下解决方案的问题:
这基本上取决于类型系统以获得我们想要的东西。但这并不是一个真正的解决方案,因为既然我们对类型系统撒了谎,编译器就无法帮助我们确保当我们认为我们确实得到了ShortStory
回报时。(例如,我们不必reverse
在上面的示例中重写以使编译器满意,但我们的类型不会是我们想要的。)
scala - 在参数化类中混合通用特征而不复制类型参数
假设我想创建一个可以混入任何 Traversable[T] 的特征。最后,我希望能够说以下的话:
并在 MoreFilterOperations 上具有以 Traversable 必须提供的任何内容表示的方法,例如:
但是,问题显然是 T 没有定义为 MoreFilterOperations 上的类型参数。一旦我这样做了,它当然是可行的,但是我的代码将显示为:
或者如果我定义了这种类型的变量:
根据我的口味,这是一种冗长的方式。我希望以这样的方式定义特征,以便我可以将后者写为:
我尝试了自我类型,抽象类型成员,但它没有产生任何有用的东西。有什么线索吗?
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。
scala - 通过使用自己的方法扩展 TraversableLike 来丰富我的库
我尝试用自己的方法扩展 TraversableLike,但失败了。
首先,看看我想要实现的目标:
这段代码工作正常,它计算出列表元素之间的差异。但我想要这样一个代码,它可以与等一起使用Seq
,Set
而不仅仅是List
.
我试过这个:
有几个错误。无论是隐式转换还是++-method
工作。另外,我不知道如何创建新类型 CC - 请参阅循环调用。
scala - 使用方法丰富 Scala 集合
如何foreachWithIndex
在 Scala 集合上添加方法?
到目前为止,这是我能想到的:
这不起作用:
引发以下错误:
但是,当我明确应用转换方法时,代码可以工作:
输出:
如何在不显式应用转换方法的情况下使其工作?谢谢。
class - 为什么我可以将方法标记为隐式而不是构造函数?
常见的 Enrich-My-Library 模式似乎类似于
为什么不能implicit
像这样将其添加到构造函数本身
考虑到构造函数只不过是一个带有一些额外限制的方法?
令人惊讶的是,以下方法确实有效:
scala - 如何在Scala中定义从一种到另一种现有类型的隐式转换?
假设我们Foo
在使用的库中有一个类,并且希望(在我们的代码文件中)实例在需要实例的地方遇到实例时Foo
隐式转换为实例。如何在 Scala 中实现这一点?String
Foo
String
scala - 重载现有的 `toInt` 方法
toInt
in 方法不带任何参数,StringLike
只能解析十进制。因此,要解析二进制、十六进制等,我们需要求助于 Java 的Integer#parseInt(String s, int radix)
.
为了纠正这种情况,我尝试了以下方法
然而,
导致 REPL 编译器“严重崩溃”并且在编译后的代码中也不起作用。
使用“丰富我的库”模式重载现有方法是否有一些限制?
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)
scala - 使用enrich-my-library 对匿名函数进行类型推断
假设我有一个方法可以将(两个元素上的函数)转换为(两个序列上的函数):
换句话说,结果函数接受两个序列xs
and ys
,并创建一个由(xs(0) f ys(0), xs(1) f ys(1), ...)
So 组成的新序列,例如,如果xss
isSeq(Seq(1,2),Seq(3,4))
和f
is (a: Int, b: Int) => a + b
,我们可以这样调用它:
或使用匿名函数:
这很好;摆脱[Int]
类型参数会很好,但我不知道如何(任何想法?)。
为了让它感觉更像这种tupled
方法,我还尝试了丰富我的库模式:
对于预定义的函数,这很好用,但匿名函数很难看
有没有另一种方法可以重新制定它以便推断类型,并且我可以使用类似的语法:
? 还是我对类型推断的要求太多了?