小编Eug*_*ota的帖子

扩展Scala集合

我想要一个试图覆盖现有密钥值的Map.我试过了:

trait Unoverwriteable[A, B] extends scala.collection.Map[A, B] {
    case class KeyAlreadyExistsException(e: String) extends Exception(e)

    abstract override def + [B1 >: B] (kv: (A, B1)): Unoverwriteable[A, B1] = {
        if (this contains(kv _1)) throw new KeyAlreadyExistsException(
            "key already exists in WritableOnce map: %s".format((kv _1) toString)
        )
        super.+(kv)
    }

    abstract override def get(key: A): Option[B] = super.get(key)
    abstract override def iterator: Iterator[(A, B)] = super.iterator
    abstract override def -(key: A): Unoverwriteable[A, B] = super.-(key)
}
Run Code Online (Sandbox Code Playgroud)

得到了:

<console>:11: error: type mismatch;
 found   : …
Run Code Online (Sandbox Code Playgroud)

generics scala traits extend scala-collections

5
推荐指数
1
解决办法
3086
查看次数

我可以在Scala中创建一个使用不同的equals / hashCode / compare实现的集合吗?

我正在寻找创建身份集的简单方法。我只希望能够跟踪遍历图形时是否“看到”了特定对象。

我不能使用常规Set,因为Set使用“ ==”(Scala中的equals方法)来比较元素。我想要的是一个使用“ eq”的集合。

有什么方法可以在Scala中创建一个Set,该Set使用一些应用程序指定的方法测试相等性,而不是在set元素上调用equals?我在寻找可以覆盖但找不到的“ wrapEquals”方法。

我知道我可以使用Java的IdentityHashMap,但是我正在寻找更通用的东西。

我的另一个想法是将每个set元素包装到另一个根据eq实现equals的对象中,但是生成大量新对象只是为了获得一个新的equals实现是浪费的。

谢谢!

scala scala-collections

5
推荐指数
1
解决办法
1935
查看次数

5
推荐指数
1
解决办法
3413
查看次数

Scala集合不一致

为什么Scala Collections API中的集合和列表之间缺乏一致性?

例如,存在不可变的Set,但也是可变的Set.如果我想使用后者,我可以简单地这样做:

val set = Set[A]()
set += new A
Run Code Online (Sandbox Code Playgroud)

但是,本身没有可变列表.如果我想使用Lists编写类似的代码片段,使用哪种数据结构?LinkedList听起来很好,因为它是可变的,但没有定义+ =方法.ListBuffer似乎满足要求,但它不是一个列表.

阅读2.8 Collections文档后,我得出结论MutableList可能是最合适的.

我仍然希望有scala.collection.mutable.List.

scala scala-collections

5
推荐指数
2
解决办法
611
查看次数

Scala:迭代集合并填充Array的最佳方法

scala noob在这里,我有一个xml节点的集合(Seq),我想基于每个节点填充一个数组:

val nodes = data.child \\"package"
var packages = new Array[Package](nodes.length)
var index = 0
for(val entry <- nodes) {
   packages(index) = new Package(entry)
   index = index+1
}
Run Code Online (Sandbox Code Playgroud)

虽然它有效但对我来说看起来并不太"scala-ish",我确信有更好的方法可以做到这一点..
任何想法?

arrays loops scala scala-2.8 scala-collections

5
推荐指数
1
解决办法
1456
查看次数

在Scala中使用并行集合的首选方法是什么?

起初我假设每个集合类都会收到一个额外的par方法,它将集合转换为适合的并行数据结构(比如map返回Scala 2.8中元素类型的最佳集合).

目前看来,一些集合类支持par方法(如数组),但其他人toParSeq,toParIterable方法(如表).这有点奇怪,因为经常不使用或推荐Array.

这是什么原因?par在所有收集课上做"正确的事" 是不是更好?

如果我有可能并行处理的数据,我应该使用哪些类型?scala.collection直接实现的特征或类型?

或者我Arrays现在应该更喜欢,因为它们似乎更便宜并行化?

parallel-processing scala language-design scala-collections

5
推荐指数
1
解决办法
633
查看次数

Scala:路径依赖类型的等价性

我如何解决两个与路径相关的类型的等价,我知道它们是相同但编译器没有?

使用Scala 2.10.0 M7我试图将AST从一个宇宙转换为另一个宇宙.

case class MacroBridge(context: Context) {
  def toMacroTree(tree: treehugger.forest.Tree): context.universe.Tree = ???
  def fromMacroTree(tree: context.universe.Tree): treehugger.forest.Tree = ???
}
Run Code Online (Sandbox Code Playgroud)

在宏实现中,我可以将其用作:

val bridge = treehugger.MacroBridge(c)
def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)
Run Code Online (Sandbox Code Playgroud)

但是,这会导致编译器错误:

[error] /scalamacros-getting-started/library/Macros.scala:21: type mismatch;
[error]  found   : c.universe.Tree
[error]  required: bridge.context.universe.Tree
[error]  possible cause: missing arguments for method or constructor
[error]     def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)
Run Code Online (Sandbox Code Playgroud)

在上面的代码c显然是相同的值bridge.context,但也许是因为它是一个值类型检查器无法检查它.放置通用类型约束没有帮助:

def fromMacroTree[A](tree: A)(implicit ev: A =:= context.universe.Tree): Tree =
Run Code Online (Sandbox Code Playgroud)

在宏中,这仍然导致错误:

[error] /scalamacros-getting-started/library/Macros.scala:21: Cannot prove …
Run Code Online (Sandbox Code Playgroud)

scala path-dependent-type scala-macros

5
推荐指数
1
解决办法
444
查看次数

创建一个Akka胖罐

我需要创建一个Nutch插件,使用Akka与一些外部应用程序通信.为了做到这一点,我需要将插件打包为胖罐 - 我正在使用sbt-assembly版本0.8.3.

当我尝试运行插件时,我得到了异常

com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'akka'
Run Code Online (Sandbox Code Playgroud)

好像Akka无法找到reference.conf.这很奇怪,因为sbt-assembly 应该能够正确打包该文件,事实上我可以在创建的jar中看到它的内容.

build.sbt看起来像这样:

import AssemblyKeys._

name := "my-project"

version := "0.1-SNAPSHOT"

scalaVersion := "2.10.0"

resolvers ++= Seq(
  "Central Repo" at "http://repo1.maven.org/maven2",
  "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/",
  "Akka io" at "http://akka.io/repository"
)

libraryDependencies ++= Seq(
  ...,
  "com.typesafe.akka" %% "akka-actor" % "2.1.1",
  "com.typesafe.akka" %% "akka-remote" % "2.1.1"
)

seq(assemblySettings: _*)

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
  {
    case "plugin.xml" …
Run Code Online (Sandbox Code Playgroud)

scala nutch sbt akka sbt-assembly

5
推荐指数
1
解决办法
3906
查看次数

SBT本机打包程序中的多个项目依赖项

我正在使用SBT本机打包程序插件(https://github.com/sbt/sbt-native-packager)来处理由多个模块组成的项目.

在我的SBT设置中,我有:

lazy val settings = packageArchetype.java_application ++ Seq(
  ...
  // Java is required to install this application
  debianPackageDependencies in Debian ++= Seq("java2-runtime"),

  // Include the module JAR in the ZIP file
  mappings in Universal <+= (packageBin in Compile) map { jar =>
    jar -> ("lib/" + jar.getName)
  }
)
Run Code Online (Sandbox Code Playgroud)

问题是生成的ZIP或DEB似乎不包含我的项目的模块依赖项.只有最终模块JAR和其中使用的库,但不包括它所依赖的模块.

你知道我怎么能解决这个问题?

debian scala jar sbt sbt-native-packager

5
推荐指数
1
解决办法
989
查看次数

如何配置jooq-sbt-plugin

我对SBT比较陌生.我想在我的SBT配置中包含jooq-sbt-plugin(GitHub).我正在使用Build.scala来处理多个项目,我想在那里包含jooq-sbt-plugin配置,但我无法弄清楚它放在哪里.

import sbt._
import Keys._

object SampleBuild extends Build {

    lazy val all = Project(id = "all", base = file("."), settings = defaultSettings) aggregate(
      one, two
    )

    lazy val one = Project(
        id = "one",
        base = file("one"),
        settings = defaultSettings ++ Seq(
            libraryDependencies ++= Dependencies.one
        )
    )

    lazy val two = Project(
        id = "two",
        base = file("two"),
        settings = defaultSettings ++ Seq(
            libraryDependencies ++= Dependencies.two
        )
    ) dependsOn (one)

    override lazy val settings = super.settings ++ …
Run Code Online (Sandbox Code Playgroud)

sql scala sbt jooq jooq-sbt-plugin

5
推荐指数
1
解决办法
843
查看次数