对于我的项目,第戎,我想知道是否可以使用Scala pickling进行JSON 序列化和反序列化.具体而言,我想是这样的def toJsonString(json: JSON, prettyPrint: Boolean = false): String
和def fromJsonString(json: String): JSON
.如何使用酸洗来创建这两种辅助方法?
尝试使用scala版本2.11.5的sbt版本0.13.7.两者都是最新的.他们一起工作吗?当我跑sbt clean compile
,它打印:
[info] 'compiler-interface' not yet compiled for Scala 2.11.5. Compiling...
error: java.lang.NoClassDefFoundError: scala/tools/nsc/typechecker/Infer$Inferencer
Run Code Online (Sandbox Code Playgroud)
当更改为scala 2.11.4时,一切正常:
[info] 'compiler-interface' not yet compiled for Scala 2.11.4. Compiling...
[info] Compilation completed in 13.434 s
Run Code Online (Sandbox Code Playgroud)
我找不到有关sbt和scala版本兼容性的任何相关来源.它是否与sbt构建针对scala 2.11有关??
这可能是一个愚蠢的问题,但我已经有一段时间不确定了.让我们假设这遍历我的列表三次:
def doSomething(list: List[Int]): List[Int] =
list.map(...).flatMap(...).map(...)
Run Code Online (Sandbox Code Playgroud)
如果我改为:
def doSomething(list: List[Int]): List[Int] =
list.toStream.map(...).flatMap(...).map(...).toList
Run Code Online (Sandbox Code Playgroud)
我保证一次迭代吗?
尝试使用名为的方法创建隐式类时,我收到意外的编译错误(在scala 2.11.8中)clone
.
以下简化用法:
class Foo(val bar: String)
object Foo {
implicit class Enrich(foo: Foo) {
def clone(x: Int, y: Int): Int = x + y
}
}
object Main extends App {
val foo = new Foo("hello")
println(foo.clone(1, 2)) // <- does not compile
}
Run Code Online (Sandbox Code Playgroud)
生成以下错误:
无法在Foo中访问类Object中的方法clone不允许受保护的方法clone,因为前缀类型Foo不符合访问发生的对象Main
但是,我可以手动应用隐式类,并成功编译:
println(Foo.Enrich(foo).clone(1, 2)) // <- OK
Run Code Online (Sandbox Code Playgroud)
如果我将方法重命名为其他东西(clone2
例如),则代码按预期编译.
我假设这与魔法有关java.lang.Cloneable
,但该方法并不期望参数.
那么这里发生了什么?
我遇到了一个问题,试图创建一个适用于所有Traversable子类(包括Array)的隐式类.我在Scala 2.11.1和2.10.4中尝试了以下简单示例:
implicit class PrintMe[T](a: Traversable[T]) {
def printme = for (b <- a) print(b)
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这应该允许隐式转换为PrintMe,以便可以在任何Traversable上调用printme,包括List和Array.例如:
scala> List(1,2,3).printme
123
// Great, works as I expected!
scala> Array(1,2,3).printme
<console>:23: error: value printme is not a member of Array[Int]
Array(1,2,3).printme
// Seems like for an Array it doesn't!
scala> new PrintMe(Array(1,2,3)).printme
123
// Yet explicitly building a PrintMe from an Array works
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?为什么隐式转换适用于List而不是数组?
我知道有一些技巧适应java Arrays但是从http://docs.scala-lang.org/overviews/collections/overview.html查看下面的图片看起来似乎Array的行为就像Traversable的子类.
如果我List[Try[A]]
在Scala中有一个过滤掉Failure(t)
值的惯用方法是什么?
一种方法是使用以下内容:
val someList: List[Try[String]] = ...
someList.filter(_.isFailure)
Run Code Online (Sandbox Code Playgroud)
是否有更"惯用"的方式,例如使用flatten
?这看起来很简单.
所以,我有一个对象,有方法,类似的东西:
object Connector {
def createObject (id : Long, x : Double, y : Double, name : String, objtype : Int, layer : String) : String = {
//some code
}
def deleteObject (id : Long) : String = {
//some code
}
def findObject (name : String) : String = {
//some code
}
//some other methods
}
Run Code Online (Sandbox Code Playgroud)
例如,我想在所有方法中处理错误,使用相同的代码:
var res = domethod(methodParams)
if (res.indexOf("Error") > 0){
doSomeOtherMethod() //that can fix error
res = domethod(methodParams) //with same params
} …
Run Code Online (Sandbox Code Playgroud) 我按照说明使用Scala 2.11构建Spark:
mvn -Dscala-2.11 -DskipTests clean package
Run Code Online (Sandbox Code Playgroud)
然后我按照说明启动:
./sbin/start-master.sh
Run Code Online (Sandbox Code Playgroud)
它在日志文件中有两行失败:
Failed to find Spark assembly in /etc/spark-1.2.1/assembly/target/scala-2.10
You need to build Spark before running this program.
Run Code Online (Sandbox Code Playgroud)
显然,它正在寻找scala-2.10版本,但我做了一个scala-2.11版本.我尝试了明显的-Dscala-2.11标志,但这没有改变任何东西.文档没有提到有关如何使用scala 2.11在独立模式下运行的任何内容.
提前致谢!
我们在Scala中有Some,None,我需要名为Default的第三个.背后的想法是:
默认(我的自定义事物)意味着用户希望我应用一些内置默认值.
它应该像None一样(即与Option兼容),我将在我的例程中以特殊方式处理Default.我看了一下:Scala:像Option(Some,None)之类的东西,但有三种状态:Some,None,Unknown
我不想用我的自定义类型完全"遮蔽"一些"无".我希望让用户使用它们并在某些情况下应用我自己的"默认".
@Michael Zajac给出了几个选择,我认为第一个非常好.
我可以内置Some,None和"artificial"之类的
case object DefaultParamHere {
def apply(): Option[String] = {
Some("Substitute me we default framework value, please")
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
用例将是:
case class Application(artifact: Artifact,
mainClass: Class[_],
jvmMemory: Option[Memory] = None,
jvmOpts: Option[String] = DefaultParamHere(),
applicationConfiguration: List[String] = Nil) extends Stage
Run Code Online (Sandbox Code Playgroud) 我有这样的事情:
case class Box[A](x: A) {
def flatMap[B](f: A => GenTraversableOnce[B]): GenTraversableOnce[B] =
f(x)
def flatMap[B](f: A => Box[B]): Box[B] =
f(x)
def map[B](f: A => B): Box[B] =
Box(f(x))
}
object Box {
for {
i <- Box(0)
j <- Box(1)
} yield i + j
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在Scala 2.12.4中编译得很好,但是不能在Scala 2.11.12中编译:
[error] Box.scala:10: missing parameter type
[error] i <- Box(0)
[error] ^
[error] one error found
[error] (core/compile:compileIncremental) Compilation failed
Run Code Online (Sandbox Code Playgroud)
为什么?我究竟做错了什么??
然后我尝试了:
for {
i: Int <- Box(0) …
Run Code Online (Sandbox Code Playgroud) scala ×10
scala-2.11 ×10
apache-spark ×1
arrays ×1
compilation ×1
implicit ×1
json ×1
monads ×1
sbt ×1
scala-2.10 ×1
scala-2.12 ×1
scalac ×1