标签: scala

在ScalaTest中使用"不应该生成[exception]"语法

我在Scala中使用Specs2和ScalaTest来处理BDD.当我断言不应该抛出给定的异常时,我已经在Specs2中写下了期望.

"do something" in {
 {
   ....
 } must not(throwA[MyException])
}
Run Code Online (Sandbox Code Playgroud)

我希望能够在ScalaTest中编写等效的代码:

"do something" in {
 evaluating {
   ....
 } should not produce[MyException]
}
Run Code Online (Sandbox Code Playgroud)

但这不编译,我找不到这样做的方法.这甚至可能吗?

提前谢谢了.

specs scala scalatest

26
推荐指数
2
解决办法
1万
查看次数

如何从shell运行sbt主类作为普通的命令行程序?

如何从shell运行sbt应用程序,以便我可以将我的应用程序作为正常的命令行程序运行(就像直接通过scala但不必设置庞大的类路径一样)?

我知道我能做到:

echo hello | sbt 'run-main com.foo.MyMain3 arg1 arg2' > out.txt
Run Code Online (Sandbox Code Playgroud)

但是这(1)需要永远开始因为它启动sbt,(2)导致所有stdout和stderr转到stdout,并且(3)导致所有输出都用logger [info]或[error]进行修饰.

我查看了https://github.com/harrah/xsbt/wiki/Launcher,但它看起来太重了,因为它下载了依赖项并设置了一个新环境等等.我只想在现有的开发环境中运行这个应用程序.

到目前为止,我已经拼凑了我自己的脚本来构建一个类路径,你还可以做一些其他的事情,比如修改你的项目文件以获得sbt打印原始类路径,但我觉得必须有更好的方法.

scala classpath sbt

26
推荐指数
3
解决办法
2万
查看次数

从Scala源生成UML图

是否有任何独立的工具(不是Eclipse或Idea插件)用于从Scala源文件生成类图?

diagram uml scala class-diagram

26
推荐指数
2
解决办法
1万
查看次数

实例化不可变配对对象

是否可以创建一个具有对合作伙伴对象的不可变引用的类,或者它是否必须是var我在创建后分配的类?

例如

class PairedObject (p: PairedObject, id: String) {
  val partner: PairedObject = p  // but I need ref to this object to create p!
}
Run Code Online (Sandbox Code Playgroud)

或类似地,我如何实例化以下对?

class Chicken (e: Egg) { 
  val offspring = e
}

class Egg (c: Chicken) {
  val mother = c
}
Run Code Online (Sandbox Code Playgroud)

scala object immutability

26
推荐指数
1
解决办法
1963
查看次数

无法从"完整配置"生成SBT 0.11的源代码

基于可用的sbt 0.11.0文档("常见任务"维基页面和其他),在看到如何在Scalaz SBT构建Scalate SBT构建中完成后,我无法弄清楚为什么我的简单示例不起作用:

import sbt._
import Keys._

object MyBuild extends Build {

  lazy val project = Project(
    id = "root", 
    base = file("."),
    settings = Defaults.defaultSettings ++ Seq(
      (sourceGenerators in Compile) <+= (sourceManaged in Compile) map { dir =>
        val file = dir / "bla.scala"
        IO.write(file, """object Bla extends App { println("bla!") }""")
        Seq(file)
      }
    )
  )

}
Run Code Online (Sandbox Code Playgroud)

把它放在一个空项目的project/build.scala上并运行"sbt compile"生成/编译什么都没有,"sbt run"抱怨它找不到任何主类.

现在,如果我将设置放在"快速配置"build.sbt中,而不是如上所述的完整配置,它就可以正常工作.

(sourceGenerators in Compile) <+= (sourceManaged in Compile) map { dir => …
Run Code Online (Sandbox Code Playgroud)

code-generation scala sbt

26
推荐指数
1
解决办法
674
查看次数

类型理论:类型种类

我已经阅读了很多有关类型,高级类型等等的有趣内容.默认情况下,Haskell支持两种类型:

  • 简单类型: *
  • 类型构造函数: * ? *

最新的GHC语言扩展ConstraintKinds增加了一种新的:

  • 类型参数约束: Constraint

在阅读这个邮件列表后,很明显可能存在另一种类型,但GHC不支持它(但这种支持是在.NET中实现的):

  • 未装箱类型: #

我已经了解了多态种类,我想我理解这个想法.Haskell也支持明确的kinded量化.

所以我的问题是:

  • 是否存在其他类型的种类?
  • 还有其他类似的语言功能吗?
  • 什么subkinding意思?它在哪里实施/有用?
  • 是否有一个类型系统kinds,就像kinds一个类型系统在上面types?(只是感兴趣)

haskell types type-theory programming-languages scala

26
推荐指数
3
解决办法
1397
查看次数

"结构细化中的参数类型可能不会引用在该细化之外定义的抽象类型"

当我编译:

object Test extends App {
  implicit def pimp[V](xs: Seq[V]) = new {
    def dummy(x: V) = x
  }
}                                                                                                                                                                                                              
Run Code Online (Sandbox Code Playgroud)

我明白了:

$ fsc -d aoeu go.scala
go.scala:3: error: Parameter type in structural refinement may not refer to an abstract type defined outside that refinement
    def dummy(x: V) = x
        ^
one error found
Run Code Online (Sandbox Code Playgroud)

为什么?

(Scala:"结构细化中的参数类型可能不会引用在该细化之外定义的抽象类型"并不真正回答这个问题.)

scala

26
推荐指数
2
解决办法
3386
查看次数

scala中trait中使用的抽象值是否有问题?

我有

trait Invoker {
  val method: Method
}
Run Code Online (Sandbox Code Playgroud)

Intellij IDEA代码检查警告我"特征中使用的抽象值".一切都很好.在特质中使用抽象值有什么问题吗?如果是这样,我应该如何指定特征的所有扩展器必须定义方法属性?

scala traits

26
推荐指数
2
解决办法
4460
查看次数

并行执行测试

我注意到SBT正在并行运行我的specs2测试.这似乎很好,除了我的一个测试涉及从文件读取和写入因此无法预测失败,例如见下文.

有没有更好的选择

  1. 将所有测试设置为串行运行,
  2. 为每个测试使用单独的文件名和拆卸?
class WriteAndReadSpec extends Specification{
  val file = new File("testFiles/tmp.txt")

  "WriteAndRead" should {
    "work once" in {
      new FileWriter(file, false).append("Foo").close
      Source.fromFile(file).getLines().toList(0) must_== "Foo"
    }
    "work twice" in {
      new FileWriter(file, false).append("Bar").close
      Source.fromFile(file).getLines().toList(0) must_== "Bar"
    }
  }

  trait TearDown extends After {
    def after = if(file.exists) file.delete
  }
}
Run Code Online (Sandbox Code Playgroud)

scala sbt specs2

26
推荐指数
1
解决办法
7676
查看次数

我应该覆盖默认的ExecutionContext吗?

在scala中使用future时,默认行为是使用默认的Implicits.global执行上下文.似乎默认情况下每个处理器可以使用一个线程.在更传统的线程Web应用程序中,当期货执行诸如等待数据库(而不是某些cpu绑定任务)之类的任务时,这似乎是一个糟糕的默认值.

我希望覆盖默认上下文在生产中是相当标准的,但我可以找到关于这样做的文档很少,似乎它可能不常见.我错过了什么吗?

concurrency scala

26
推荐指数
1
解决办法
5530
查看次数