我想要一个试图覆盖现有密钥值的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) 我正在寻找创建身份集的简单方法。我只希望能够跟踪遍历图形时是否“看到”了特定对象。
我不能使用常规Set,因为Set使用“ ==”(Scala中的equals方法)来比较元素。我想要的是一个使用“ eq”的集合。
有什么方法可以在Scala中创建一个Set,该Set使用一些应用程序指定的方法测试相等性,而不是在set元素上调用equals?我在寻找可以覆盖但找不到的“ wrapEquals”方法。
我知道我可以使用Java的IdentityHashMap,但是我正在寻找更通用的东西。
我的另一个想法是将每个set元素包装到另一个根据eq实现equals的对象中,但是生成大量新对象只是为了获得一个新的equals实现是浪费的。
谢谢!
如何在scala(mutable/immutable)中创建有序映射?
为什么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 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",我确信有更好的方法可以做到这一点..
任何想法?
起初我假设每个集合类都会收到一个额外的par方法,它将集合转换为适合的并行数据结构(比如map返回Scala 2.8中元素类型的最佳集合).
目前看来,一些集合类支持par方法(如数组),但其他人toParSeq,toParIterable方法(如表).这有点奇怪,因为经常不使用或推荐Array.
这是什么原因?par在所有收集课上做"正确的事" 是不是更好?
如果我有可能并行处理的数据,我应该使用哪些类型?scala.collection直接实现的特征或类型?
或者我Arrays现在应该更喜欢,因为它们似乎更便宜并行化?
我如何解决两个与路径相关的类型的等价,我知道它们是相同但编译器没有?
使用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) 我需要创建一个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) 我正在使用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和其中使用的库,但不包括它所依赖的模块.
你知道我怎么能解决这个问题?
我对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)