对于在Scala中读取文件,有
Source.fromFile("file.txt").mkString
Run Code Online (Sandbox Code Playgroud)
是否有一种等效和简洁的方法来将字符串写入文件?
大多数语言支持这样的东西.我最喜欢的是Groovy:
def f = new File("file.txt")
// Read
def s = f.text
// Write
f.text = "file contents"
Run Code Online (Sandbox Code Playgroud)
我想将代码用于从单行到短代码的程序.必须使用自己的库在这里没有意义.我希望有一种现代语言能让我方便地写一些文件.
有类似的帖子,但他们没有回答我的确切问题或专注于较旧的Scala版本.
例如:
我开始研究Scala Koans,它是围绕一系列单元测试组织的,需要填充空白.(这个想法是在类似的Ruby Koans项目之后建模的.)你启动了运行测试的sbt工具,并告诫:
[info] + ***************************************** [info] + [info] + [info] + [info] + Please meditate on koan "None equals None" of suite "AboutEmptyValues" [info] + [info] + [info] + [info] + *****************************************
...所以你去看看这个单元测试它说:
test("None equals None") { assert(None === __) }
......并且,在冥想之后,你意识到你应该填写这样的空白:
test("None equals None") { assert(None === None) }
......然后它继续进行下一次单元测试.
不过,我的问题是这个===
运算符是什么?我似乎无法在任何地方找到它.这是Scala Koans项目本身定义的DSL运营商吗?或者它是ScalaTest框架的一部分?或者在Scala中?
我有一些代码嵌套调用flatMap,如下所示:
foo.flatMap(implicit f => bar(123).flatMap(b =>
/* and so on... implicit f is still in scope here.*/
))
Run Code Online (Sandbox Code Playgroud)
通常,人们会将其写为理解,这使得代码更具可读性:
for {
f <- foo
b <- bar(123)
/* yet more method calls that need f as an implicit parameter*/
}
Run Code Online (Sandbox Code Playgroud)
但我需要f
暗示,我不认为有办法用于理解.在那儿?当然我可以明确地传递f,但这意味着再见DSL.我对Scala 2.9和2.10的答案感兴趣.
为了清楚起见,我想做这样的事情,但它不会编译:
for {
implicit f <- foo
b <- bar(123) //bar takes implicit argument
/* yet more method calls that need f as an implicit parameter*/
}
Run Code Online (Sandbox Code Playgroud)
编辑:也许一个功能请求是一个好主意?
EDIT2:这应该适用于所有可以用于理解的类型,因此不仅仅是通常的集合类型,如List
或Seq
,还有Future …
我想要一个我正在构建的程序,以便能够在运行时报告自己的版本(例如scala myprog.jar --version
).传统上在maven项目中,我使用资源过滤(pom.xml - > file.properties - >在运行时读取值).我知道有sbt-filter-plugin来模仿这个功能,但我很好奇是否有更标准/首选/聪明的方法在SBT中这样做.
tl; dr如何读取build.sbt
运行时定义的版本号?
我一直在寻找新的Scala 2.9并行系列,我希望放弃一大堆类似东西的狡猾的业余版本.特别是,我想用自己的东西替换默认实现基础的fork join pool(例如,通过actor分配网络任务评估的东西).我的理解是,这只是应用Scala的"可堆叠修改"范式的问题,但是集合库非常令人生畏,我不确定哪些位需要修改!
一些具体问题:
ForkJoinTasks
?FutureThreadPoolTasks
.我如何构建一个使用这个特性的集合而不是ForkJoinTasks
?AdaptiveWorkStealingTasks
并以某种方式实例化使用这个新特征的集合实例?(作为参考,上面提到的所有特征都在Tasks.scala中定义.)
特别是代码示例非常受欢迎!
scala 2.9.1控制台中的':javap'命令需要'classpath'中的tools.jar(来自JDK6).从cmd-line可以使用'-cp'参数或CLASSPATH环境变量来完成.
如何对使用'console'和'console-quick'命令从SBT调用的scala控制台执行相同的操作?
我正在使用一个简单的测试规范使用喷雾,我无法正确编译,不知道我做错了什么.我的scala版本是2.9.3并且喷涂1.0.1(更新其中任何一个都不是合适的选项).这是我的测试规范代码:
import org.specs2.mutable.Specification
import spray.testkit.Specs2RouteTest
import spray.http._
import akka.util.Duration
import java.util.concurrent.TimeUnit
import service.MyProxy
abstract class MyTestSpec extends Specification with Specs2RouteTest with MyProxy{
val duration = Duration(30, TimeUnit.SECONDS)
implicit val routeTestTimeout = RouteTestTimeout(duration)
"MyProxy" should {
"return a json for GET requests to the /api/getclass/classCode path for a regular request" in {
Get("/api/getclass/123/") ~> myRoutes~> check {
responseAs[String] must contain("classCode")
contentType === ContentTypes.`application/json`
}
}
} // end should...
} //end class
Run Code Online (Sandbox Code Playgroud)
我在运行测试时遇到此错误.
[error] C:\Users\Desktop\Project\MyTestSpec.scala:23: could not find implicit value for …
Run Code Online (Sandbox Code Playgroud) 我试图使用递归编程Scala中的硬币更改问题.我写的代码如下.
def countChange(money: Int, coins: List[Int]): Int = {
def ways(change: List[Int], size: Int, capacity: Int): Int = {
if(capacity == 0) 1
if((capacity < 0) || (size <= 0)) 0
//println and readLine to check and control each recursive call.
println("calling ways(",change, change.length-1, capacity,") + ways(",change, change.length, capacity - change(change.length - 1),")")
readLine()
//
ways(change, change.length-1, capacity) + ways(change, change.length, capacity - change(change.length - 1))
}
ways(coins, coins.length, money)
}
Run Code Online (Sandbox Code Playgroud)
在运行代码时,它不会终止并继续调用第一个递归调用.我哪里错了?
我有一个可能的输入值列表
val inputValues = List(1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)
我有一个非常长的计算功能,给我一个结果
def reallyLongFunction( input: Int ) : Option[String] = { ..... }
Run Code Online (Sandbox Code Playgroud)
使用scala并行集合,我可以很容易地做到
inputValues.par.map( reallyLongFunction( _ ) )
Run Code Online (Sandbox Code Playgroud)
为了得到所有结果,并行.问题是,我真的不想要所有的结果,我只想要FIRST的结果.一旦我的一个输入成功,我想要我的输出,并希望继续我的生活.这做了很多额外的工作.
那么我如何才能充分利用这两个世界呢?我想要
编辑 - 我解决它就像一个愚蠢的java程序员一样
@volatile var done = false;
Run Code Online (Sandbox Code Playgroud)
在我的内部设置和检查reallyLongFunction
.这有效,但感觉不太scala.想要一个更好的方法来做到这一点....
scala ×10
scala-2.9 ×10
sbt ×2
implicit ×1
javap ×1
routing ×1
scala-2.10 ×1
scalatest ×1
spray ×1
spray-test ×1