小编Jim*_*Jim的帖子

带案例类的双向引用

是否可以在案例类中实现双向树.这看起来应该很容易,但我很难过

case class Node(name:String, parent:Option[Node], children:List[Node])
Run Code Online (Sandbox Code Playgroud)

我想添加一个孩子(并获得一个新的根) - 类似的东西

def addChild(n:String):Node = {
  Node(name, parent, Node(n, Some(this), Nil)::children)
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为孩子中的"父母"将不再引用将孩子列为孩子的节点.这是可能的不可变列表和案例类?

根据下面给出的答案

case class Node(name: String, parent: () => Option[Node], children: List[Node]) {
  def makeChild(name: String) = {
    lazy val newParent:Node = Node(this.name, this.parent, kid :: this.children)
    lazy val kid:Node = Node(name, () => Some(newParent), Nil)
    newParent
  }
}
Run Code Online (Sandbox Code Playgroud)

scala case-class

9
推荐指数
1
解决办法
841
查看次数

为什么map和Set在scala.Predef中有别名?

10次​​中的9次,只是使用MapSet表现得像我期望的那样,但偶尔会出乎意料地被击中

error: type mismatch; 
[INFO]  found   : scala.collection.Set[String]
[INFO]  required: Set[String]
Run Code Online (Sandbox Code Playgroud)

例如,来自REPL:

scala> case class Calculator[+T](name: String, parameters: Set[String])
defined class Calculator

scala> val binding=Map.empty[String, String]
binding: scala.collection.immutable.Map[String,String] = Map()

scala> Calculator("Hello",binding.keySet)
<console>:9: error: type mismatch;
found   : scala.collection.Set[String]
required: Set[String]
       Calculator("Hello",binding.keySet)
                                  ^
Run Code Online (Sandbox Code Playgroud)

我想我理解错误,即对别名类型的函数调用返回实际类型.

因此在我看来解决方案是导入无别名的类型.在我的项目中的每个其他文件现在将生成类型不匹配错误,所以我将不得不在每个文件中导入它.这导致了我在标题中提出的问题 - Predef中别名的目的是什么,如果最终我还需要导入实际的包?

我的理解是否有缺陷,或者我的用例不是典型的,或两者兼而有之?

scala

7
推荐指数
1
解决办法
3179
查看次数

如何测试case类构造函数的参数?

我想测试我的case类构造函数的参数,如果它们在某些测试中失败则抛出异常.当我尝试编写自己的apply方法时,编译器抱怨了(多个'apply'方法.

我想我可以把它变成一个非案例类,并自己做apply/unapply构造函数字段,但我希望不要这样做.

谢谢

scala case-class

6
推荐指数
1
解决办法
2306
查看次数

这是scala.xml.Elem中的错误吗?

将Set [String]映射到Set [Elem]的属性可以很好地使用一个属性,但是当共享其中一个属性时,似乎无法使用多个属性:

scala> val s1=Set("A","B","C")
s1: scala.collection.immutable.Set[java.lang.String] = Set(A, B, C)

scala> s1.map((a:String)=>{<X w={a}></X>})
res3: scala.collection.immutable.Set[scala.xml.Elem] = Set(<X w="A"></X>, <X w="B"></X>, <X w="C"></X>)

scala> s1.map((a:String)=>{<X w={a} k="SSS"></X>})
res4: scala.collection.immutable.Set[scala.xml.Elem] = Set(<X k="SSS" w="A"></X>)
Run Code Online (Sandbox Code Playgroud)

B&C发生了什么事?

还是我对Elems平等的理解错了?

xml scala

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

scalaxb生成的代码在编译期间导致堆栈溢出

我正在使用scalaxb从XSD生成Scala代码.(特别是我正在使用maven scalaxb插件.)代码生成阶段顺利运行,并且眼睛注视它们,生成的scala文件看起来很好.但是当我尝试编译时,我得到了堆栈溢出:

[ERROR] error: java.lang.StackOverflowError
[INFO]  at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:754)
[INFO]  at scala.tools.nsc.matching.MatrixAdditions$MatchMatrixOptimizer$lxtt$2$.transform(MatrixAdditions.scala:113)
[INFO]  at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:845)
[INFO]  at scala.tools.nsc.matching.MatrixAdditions$MatchMatrixOptimizer$lxtt$2$.transform(MatrixAdditions.scala:113)
[INFO]  at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:837)
[INFO]  at scala.tools.nsc.matching.MatrixAdditions$MatchMatrixOptimizer$lxtt$2$.transform(MatrixAdditions.scala:113)
[INFO]  at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:821)
[INFO]  at scala.tools.nsc.matching.MatrixAdditions$MatchMatrixOptimizer$lxtt$2$.transform(MatrixAdditions.scala:113)
[INFO]  at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:821)
[INFO]  at scala.tools.nsc.matching.MatrixAdditions$MatchMatrixOptimizer$lxtt$2$.transform(MatrixAdditions.scala:113)
[INFO]  at scala.tools.nsc.ast.Trees$Transformer.transform(Trees.scala:821)
[INFO]  at scala.tools.nsc.matching.MatrixAdditions$MatchMatrixOptimizer$lxtt$2$.transform(MatrixAdditions.scala:113)

...

[INFO]  at scala.collection.mutable.ListBuffer$$anon$1.foreach(ListBuffer.scala:311)
[INFO]  at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:294)
[INFO]  at scala.tools.nsc.transform.ExplicitOuter$Phase.run(ExplicitOuter.scala:539)
[INFO]  at scala.tools.nsc.Global$Run.compileSources(Global.scala:949)
[INFO]  at scala.tools.nsc.Global$Run.compile(Global.scala:1034)
[INFO]  at scala.tools.nsc.Main$.process(Main.scala:106)
[INFO]  at scala.tools.nsc.Main$.main(Main.scala:123)
[INFO]  at scala.tools.nsc.Main.main(Main.scala)
[INFO]  ... 6 more
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我正在使用的xsd已经过测试并可以使用jaxb.

Scala版本是2.9.0-1,scalaxb是0.6.2.

xml scala jaxb scalaxb

3
推荐指数
1
解决办法
365
查看次数

标签 统计

scala ×5

case-class ×2

xml ×2

jaxb ×1

scalaxb ×1