我想定义一些注释并在Scala中使用它们.
我看着斯卡拉的来源,发现scala.annotation包,有喜欢的一些注释tailrec,switch,elidable,等等.所以我定义了一些注释:
class A extends StaticAnnotation
@A
class X {
@A
def aa() {}
}
Run Code Online (Sandbox Code Playgroud)
然后我写了一个测试:
object Main {
def main(args: Array[String]) {
val x = new X
println(x.getClass.getAnnotations.length)
x.getClass.getAnnotations map { println }
}
}
Run Code Online (Sandbox Code Playgroud)
它打印一些奇怪的消息:
1
@scala.reflect.ScalaSignature(bytes=u1" !1* 1!AbCaE
9"a!Q!! 1gn!!.<b iBPE*,7
Ii#)1oY1mC&1'G.Y(cUGCa#=S:LGO/AA!A 1mI!)
Run Code Online (Sandbox Code Playgroud)
似乎我无法获得注释aaa.A.
如何在Scala中正确创建注释?以及如何使用和获取它们?
我有一个嵌入式neo4j服务器,管理控制台在Play 2.0.1应用程序中运行.我最近升级到与DeadBolt兼容的候选版本,发现该应用程序不再运行.
要启动服务器,我正在执行以下操作:
graphDb = (GraphDatabaseAPI) new GraphDatabaseFactory()
.newEmbeddedDatabaseBuilder(CONF_DBMETA_LOCATION)
.setConfig(ShellSettings.remote_shell_enabled, "true")
.newGraphDatabase();
ServerConfigurator config;
config = new ServerConfigurator(graphDb);
// let the server endpoint be on a custom port
srv = new WrappingNeoServerBootstrapper(graphDb, config);
srv.start();
Run Code Online (Sandbox Code Playgroud)
不幸的是,我得到:
> java.lang.RuntimeException:
> org.neo4j.kernel.lifecycle.LifecycleException: Component
> 'org.neo4j.kernel.logging.LogbackService@4c043845' failed to
> initialize. Please see attached cause exception.
Run Code Online (Sandbox Code Playgroud)
我已经尝试从我的Build.scala中删除slf4j和logback依赖项,其中添加了neo4j-server但无济于事.似乎neo4j正在加载错误的logback.xml.此外,如果我将noTransitive()添加到neo4j-server依赖项中,启动时的logback.xml警告就会消失.我想neo4j特定的logback.xml嵌入在jar中,并导致问题.我看到的一个可能的解决方案是通过代码编写自定义配置,但我不确定如何执行此操作.有什么想法吗?作为参考,我在启动时遇到这些错误:
> 22:11:05,124 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find
> resource [logback.groovy]
> 22:11:05,125 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find
> resource [logback-test.xml]
> 22:11:05,125 |-INFO in …Run Code Online (Sandbox Code Playgroud) 我们有许多较小的sbt项目,我们希望将它们分开(没有多项目构建).但是,我们希望在构建之间共享配置.为了做到这一点,我们目前还有另一个项目,所有项目都在项目/项目/ Build.scala文件中用作库依赖项.我们能够通过这种方式仅使用内置的sbt功能集中构建配置.
我们还没想到的是如何集中插件特定的构建配置.例如,我们对我们的几个服务使用sbt-assembly.我们正在调整程序集mergeStrategy,并希望在所有项目中使用它.我们如何重新使用配置?
另外,我们如何自动为我们的所有构建提供某些sbt-plugins,例如汇编或标量插件,而无需手动将其添加到每个构建中?
我厌倦了总是做以下的事情,以便为我的每个域实体使用光滑进行数据库访问.
database withSession {
implicit session =>
val entities = TableQuery[EntityTable]
val id = //Some ID
val q = for {
e <- entities if e.id === id
} yield (e)
val entity = q.first
}
Run Code Online (Sandbox Code Playgroud)
(注:EntityTable物等规定描述这里)
所以我决定我想要一个通用的数据库访问对象来处理这个问题.用法看起来应该是这样的
[...]
val entityDAO = new GenericDAO[Entity, EntityTable, String]()
[...]
database withSession { implicit session =>
val id = // Some ID
val entity = entityDAO.get(id)
}
Run Code Online (Sandbox Code Playgroud)
我尝试实现GenericDAO看起来像这样
class GenericDAO[T, TB, PK](implicit session: Session) {
val entities = TableQuery[TB] …Run Code Online (Sandbox Code Playgroud) 在我们的 haskell 代码库中,业务逻辑与跟踪和日志代码交织在一起。这会模糊业务逻辑,使其更难理解和调试。我正在寻找如何减少日志记录和跟踪的代码占用空间以使业务逻辑更加突出的想法。
我们的代码目前大致如下所示:
someFunction a b cs =
withTaggedSpan tracer "TRACE_someFunction" [("arg_b", show b)] $ do
logDebug logger $ "someFunction start: " <> show (trimDownC <$> cs)
result <- do ... some business logic ...
if isError result then
logError logger $ "someFunction error: " <> show result
else
logDebug logger $ "someFunction success: " <> show (trimDownResult result)
Run Code Online (Sandbox Code Playgroud)
一个观察结果是 whe 主要跟踪整个函数体并在开始和结束时记录。这应该允许将跟踪和日志记录合并到单个帮助程序中,并通过元编程自动提取函数名称和捕获值的名称。我之前在其他语言中使用过 AST 转换编译时宏和运行时内省,但没有在 Haskell 中使用过。
使用 Template Haskell、HasCallStack 或其他选项执行此操作的好方法是什么?
(交叉发布在https://www.reddit.com/r/haskell/comments/gdfu52/extracting_context_for_tracinglogging_via_haskell/)