一个Scala中最强大的模式是充实,我的图书馆*模式,它采用隐式转换为出现添加方法,以现有的类,而不需要动态方法解析.例如,如果我们希望所有字符串都有spaces
计算他们有多少个空格字符的方法,我们可以:
class SpaceCounter(s: String) {
def spaces = s.count(_.isWhitespace)
}
implicit def string_counts_spaces(s: String) = new SpaceCounter(s)
scala> "How many spaces do I have?".spaces
res1: Int = 5
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种模式在处理泛型集合时遇到了麻烦.例如,已经询问了许多关于按顺序对项目进行分组的问题.没有内置的东西可以一次性工作,所以这似乎是使用泛型集合C
和泛型元素类型的rich-my-library模式的理想候选者A
:
class SequentiallyGroupingCollection[A, C[A] <: Seq[A]](ca: C[A]) {
def groupIdentical: C[C[A]] = {
if (ca.isEmpty) C.empty[C[A]]
else {
val first = ca.head
val (same,rest) = ca.span(_ == first)
same +: (new SequentiallyGroupingCollection(rest)).groupIdentical
}
}
}
Run Code Online (Sandbox Code Playgroud)
当然,除了它不起作用.REPL告诉我们:
<console>:12: error: not found: …
Run Code Online (Sandbox Code Playgroud) 学习 Scala 并且我一直想要一个等效于LINQ 的 Single() 方法。例子,
val collection: Seq[SomeType]
val (desiredItem, theOthers) = collection.partition(MyFunc)
desiredItem.single.doSomething
// ^^^^^^
Run Code Online (Sandbox Code Playgroud)
我可以使用,desiredItem.head
但如果 MyFunc 实际上匹配了几个呢?我想要保证只有一个。
编辑 #2重复的问题说'不,没有,但这里是如何构建它'。所以我在想,如果这是一个常见的需求,它会出现在基本 API 中。正确编写的 Scala 程序需要这个吗?
即我想为枚举编写自己的valueOf,因为现在Scala设计者已经删除了这个方法(奇怪的调用 - https://issues.scala-lang.org/browse/SI-4571).
def valueOf[E <: Enumeration](s : String) =
E#Value.values.filter(it => it.toString==s).single()
Run Code Online (Sandbox Code Playgroud)
不要太注意单一,它只是像Linq一样的包装器(参见:Scala中IEnumerable LINQ等价物的图表?).
问题在于E#Value.
如何正确访问此别名,即如何访问泛型类型的别名?请把这个Enum作为例子!
有withName方法,即使它被认为是替换它被设计破坏,值也不是名称,所以我不会用它来避免进一步混淆代码正在做什么.