我在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)
但这不编译,我找不到这样做的方法.这甚至可能吗?
提前谢谢了.
如何从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打印原始类路径,但我觉得必须有更好的方法.
是否有任何独立的工具(不是Eclipse或Idea插件)用于从Scala源文件生成类图?
是否可以创建一个具有对合作伙伴对象的不可变引用的类,或者它是否必须是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) 基于可用的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) 我已经阅读了很多有关类型,高级类型等等的有趣内容.默认情况下,Haskell支持两种类型:
*
* ? *
最新的GHC语言扩展ConstraintKinds增加了一种新的:
Constraint
在阅读这个邮件列表后,很明显可能存在另一种类型,但GHC不支持它(但这种支持是在.NET中实现的):
#
我已经了解了多态种类,我想我理解这个想法.Haskell也支持明确的kinded量化.
所以我的问题是:
subkinding
意思?它在哪里实施/有用?kinds
,就像kinds
一个类型系统在上面types
?(只是感兴趣)当我编译:
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:"结构细化中的参数类型可能不会引用在该细化之外定义的抽象类型"并不真正回答这个问题.)
我有
trait Invoker {
val method: Method
}
Run Code Online (Sandbox Code Playgroud)
Intellij IDEA代码检查警告我"特征中使用的抽象值".一切都很好.在特质中使用抽象值有什么问题吗?如果是这样,我应该如何指定特征的所有扩展器必须定义方法属性?
我注意到SBT正在并行运行我的specs2测试.这似乎很好,除了我的一个测试涉及从文件读取和写入因此无法预测失败,例如见下文.
有没有更好的选择
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中使用future时,默认行为是使用默认的Implicits.global执行上下文.似乎默认情况下每个处理器可以使用一个线程.在更传统的线程Web应用程序中,当期货执行诸如等待数据库(而不是某些cpu绑定任务)之类的任务时,这似乎是一个糟糕的默认值.
我希望覆盖默认上下文在生产中是相当标准的,但我可以找到关于这样做的文档很少,似乎它可能不常见.我错过了什么吗?
scala ×10
sbt ×3
classpath ×1
concurrency ×1
diagram ×1
haskell ×1
immutability ×1
object ×1
scalatest ×1
specs ×1
specs2 ×1
traits ×1
type-theory ×1
types ×1
uml ×1