我从Akka 2.2.3迁移到2.3.0-RC4并在应用程序启动时收到此错误消息:
error while starting up loggers
akka.ConfigurationException: Logger specified in config can't be loaded
[akka.event.slf4j.Slf4jEventHandler] due to
[java.lang.ClassNotFoundException: akka.event.slf4j.Slf4jEventHandler]
Run Code Online (Sandbox Code Playgroud)
我有这些SBT依赖项:
val akkaVersion = "2.3.0-RC4"
"com.typesafe.akka" % "akka-actor_2.10" % akkaVersion
"com.typesafe.akka" % "akka-remote_2.10" % akkaVersion
"com.typesafe.akka" % "akka-kernel_2.10" % akkaVersion
"com.typesafe.akka" % "akka-slf4j_2.10" % akkaVersion
"com.typesafe.akka" % "akka-testkit_2.10" % akkaVersion % "test"
Run Code Online (Sandbox Code Playgroud)
在我升级之前使用Akka 2.2.3版本时,日志工作正常(项目中没有进行任何其他更改).
以下是我在我的使用中使用logger的方法application.conf:
akka.loggers = ["akka.event.slf4j.Slf4jEventHandler"]
Run Code Online (Sandbox Code Playgroud)
我检查了SBT下载的jar文件Slf4jEventHandler,只出现在旧版本中:
Slf4jEventHandler:~/.ivy2/cache/com.typesafe.akka/akka-slf4j_2.10/jars/akka-slf4j_2.10-2.3.0-RC4.jarSlf4jEventHandler:~/.ivy2/cache/com.typesafe.akka/akka-slf4j_2.10/jars/akka-slf4j_2.10-2.2.3.jar我想知道我是否应该使用其他一些记录器类,我是否缺少依赖性,或者它可能没有被错误打包.我在文档中找不到有关此更改的任何内容.
我不知道如何在不知道/指定其类型的情况下如何访问对象成员RECURSIVELY.在我的情况下,问题仅限于我想要访问的lazy vals和object成员.对象可以嵌套到lazy vals存在于其中的任何深度.例如:
object TestShallow {
lazy val value1 = 1
}
object TestDeep {
lazy val value1 = 1
object NestedObj {
lazy val value2 = 2
}
}
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止:
import scala.reflect.ClassTag
import scala.reflect.runtime.universe._
def evalMemberValues[A: TypeTag](topLevelObj: A)(implicit c: ClassTag[A]): Unit = {
val mirror = runtimeMirror(getClass.getClassLoader)
def loop[B: TypeTag](obj: B)(implicit c: ClassTag[B]): Unit = {
println(s"INSPECTING: $obj: ${typeOf[B]}")
val members = typeOf[B].decls.filter(_.isPublic)
members.foreach { m =>
if(m.isTerm && m.isModule) {
println(s"MODULE: $m") …Run Code Online (Sandbox Code Playgroud) 我有一个简单的功能:
let rec ap x y = if x < 10 then 12 else ap((x-1) (y));;
Run Code Online (Sandbox Code Playgroud)
但我不断得到的错误是:
Error: This expression has type int
This is not a function; it cannot be applied.
Run Code Online (Sandbox Code Playgroud)
我现在已经坚持了2个小时,我无法弄清楚为什么这不起作用?
此外,我只是简化了函数,因为在我的实际ocaml代码中,问题归结为此.我不确定这是否与currying有关,但有人可以解释为什么会发生这种情况吗?
假设我有一个Scala列表List("apple", "orange", "banana", "chinese gooseberry")*.我想搜索此列表并返回列表中与我已有项目相关的上一项.
例如:getPrevious(fruit: String, fruits: List[String]): Option[String]应该返回
Some("apple")如果我把它称为fruitarg "orange";Some("banana")为 "chinese gooseberry";None如果我调用它"apple"(没有以前的元素存在)或"potato"(不存在于列表中).很容易完成,但我怎么能以优雅的功能方式做到这一点?我能想到的最好的是以下内容:
def previous(fruit: String, fruits: List[String]): Option[String] =
fruits.sliding(2)
.filter { case List(previous, current) => current == fruit }
.toList
.headOption
.map { case List(previous, current) => previous }
Run Code Online (Sandbox Code Playgroud)
它有效,但它不优雅或高效.我特别讨厌转换filter迭代器toList.我怎样才能改进它?
(*作为一个旁边,是List用于sliding迭代的最佳集合?)
我正在尝试定义一些上下文,以便为每行数据表执行它(在每行上运行断言之前).
我找到了这个例子,但对于我的生活,我无法弄清楚如何编写完整的测试套件.我想定义一次上下文并与所有示例共享.这大致是我所拥有的:
class SomeSuite extends Specification with DataTables {
// TODO: define context somehow???
// val context = new Before { println("BEFORE") }
"test 1" should {
"do something" in {
context |
"col1" | "col2" |
val1 ! val2 |
val3 ! val4 |> {
(a, b) => //some assertion with (a, b)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想在每次断言(a,b)之前每次打印(共2次)"BEFORE".
我真的很感激任何帮助.
谢谢 ;)
感谢Eric,这是我的最终代码.我只添加了"隐式",因为许多测试都共享了上下文:
class SomeSuite extends Specification with DataTables {
implicit val context = new Before { def …Run Code Online (Sandbox Code Playgroud) 我已经在LinkedIn上回答了这个问题,我认为分享它是有用和有趣的.问题是:
"假设我们有像这样的文件{_id: ..., data: ..., timestamp: ...}.
有没有办法编写满足以下规则的更新条件:
1如果没有以下文件,_id则插入此文件;
2如果存在文件与以下_id则
2.1如果新的时间戳大于存储的时间戳则更新data;
2.2否则什么都不做"