繁体   English   中英

Scala Intellij - Op-Rabbit语法高亮问题

[英]Scala Intellij - Op-Rabbit Syntax highlighting issue

我正在尝试使用op-rabbit https://github.com/SpinGo/op-rabbit将我的Scala应用程序连接到RabbitMq。 示例代码https://github.com/SpinGo/op-rabbit/blob/master/demo/src/main/scala/demo/Main.scala完美无缺。

我想用Intellij的想法来解决这个问题。 IDE在使用代码上产生问题:

channel(qos=3) {
  consume(demoQueue) {
    body(as[Data]) { data =>
      println(s"received ${data}")
      ack
    }
  }
}

我在data =>上得到一个错误...它说它的类型不匹配

Type mismatch, expected: ::[Data, HNil] => op_rabbit.Handler, actual: Data => op_rabbit.Handler

如果这解决了我试图将注释数据作为无形的HList注释的问题,我会绝对精确地手动注释数据变量。

channel(qos=3) {
  consume(demoQueue) {
    body(as[Data]) { data: HList =>
      println(s"received ${data}")
      ack
    }
  }
}

IDE很高兴...不幸的是编译器不是真的:D :(。像这样代码不再编译了。

任何的想法?

Intellij和Scala插件更新到最新版本。

好吧,如果IDE抱怨而不是编译器会更好。

data类型是Data而不是HListData :: HNil

channel(qos=3) {
  consume(demoQueue) {
    body(as[Data]) { (data: Data) =>
      println(s"received ${data}")
      ack
    }
  }
}

您应该习惯IDE有时会错误地突出显示Scala中的代码。 路径依赖类型,隐含,宏等有时太复杂,IDE无法处理。


以下代码在2017.3 EAP(Ultimate Edition)Build#IU-173.3302.5中正确突出显示

val directive = body(as[Data])

channel(qos = 3)(
  consume(demoQueue)(
    directive(data => {
      println(s"received ${data}")
      ack
    })
  )
)

作为短期解决方案,我采用了这种方式:

val handle = (data: Data) => {
  println(s"received ${data}")
  ack
}

val demoQueue = Queue("demo", durable = false, autoDelete = true)
val subscription = Subscription.run(rabbitControl) {
  channel(qos=3) {
    consume(demoQueue) /*_*/ {
      body(as[Data]) {handle}
    }
  }
}

我禁用了有问题的块的类型检查。 不过我想在我的处理代码中进行类型检查。 我把那部分移到了句柄功能上。 这样IDE就会检查句柄功能。 使用/ * _ * /可以禁用对代码特定部分的类型检查。

仍希望有更好的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM